オプティマイザ・ヒント
SQL文を最適化するためにオプティマイザに与える提案
構文
(DELETE/SELECT/UPDATE) /*+ hint and text */
(DELETE/SELECT/UPDATE) --+ hint and text
つまりコメント文の文頭に+をつける。
hintには下記リストから適切なものを選択する。
hintリスト
Hint詳細
==最適化アプローチに対するヒントと目標==
コストベースまたはルールベースの最適化アプローチを選択することができる。
さらに、コストベースのアプローチでは、最高のスループットまたは最高の応答時間を目標として選択することができる。
SQL文に最適化アプローチと目標を指定するヒントが含まれている場合、オプティマイザは、総計、OPTIMIZER_MODE初期化パラメータの値、およびALTER SESSIONコマンドのOPTIMIZER_GOALパラメータの有無にかかわらず、指定されたアプローチを使用する。
最高のスループットを目標としてコストベースのアプローチを使用する。
最高の応答時間を目標としてコストベースのアプローチを選択して、文ブロックを最適化する。
全表走査より索引走査を選択
ソート/マージ結合よりネストしたループ結合を選択
ソート処理を避けるために索引走査を選択
文ブロックに対してルールベースの最適化を選択する。
Memo : ORACLEの将来バージョンでは、ルールベースのアプローチとともに、RULEヒントは利用不可となる。
==表のアクセス方法==
指定された表に対して索引走査を選択する。文が索引範囲走査をしようする場合、ORACLEは索引付きの値について昇順に索引エントリを走査する。
指定された表に対して索引走査を選択する。文が索引範囲走査を使用する場合、ORACLEは索引エントリを索引付きの値について降順に走査する。
索引は最低2つ指定しなければならないが、5つを超える索引を指定することはできない。
FROM句に指定された順序(左から右)で表を結合する。
==結合順序に対するヒント==
内部表として指定した表を使用しているネストしたループ結合によって、別の行ソースに指定したそれぞれの表を結合する。
ソート/マージ結合で指定されたそれぞれの表を別の行ソースと結合する。
覚え書き
・ヒントは、それらが含まれる文ブロックの最適化だけに適用される。
たとえばUNION演算子で結合した2つの構成要素からなる複合問い合わせは合計2つの文ブロックがあることになり、最初の構成要素に指定したヒントは2番目の構成要素には適用されない。
・文ブロックはヒントを含むコメントを1つだけ持つことができる。
誤ったヒント指定は無視されエラーを戻さない。
構文エラーを含むヒントを無視するが、同じコメント内の正しいヒント文は考慮にいれる。
矛盾するヒントの組み合わせを無視するが、同じコメント内で他のヒントを採用。
SQL*Formsバージョン3のトリガーのように、PL/SQLバージョン1を使用する環境では、すべてのヒントが無視される。
・オプティマイザは、コストベースのアプローチを使用しているときだけヒントを認識する。文ブロックに(RULEヒントを除く)ヒントが含まれている場合、オプティマイザはコストベースのアプローチを自動的に使用する。
用語
コストベース
Oracle8ではデフォルト
SQL文内の1個または複数の表内のデータを健勝して、最も促との安いアクセスパスを選択する。(つまり、使用するリソースと時間を最小にする)
ルールベース
一連のルールに基づいてデータアクセスパスの有効性をランク付けする。
スループット