オプティマイザ・ヒント

SQL文を最適化するためにオプティマイザに与える提案


構文

(DELETE/SELECT/UPDATE) /*+ hint and text */

(DELETE/SELECT/UPDATE) --+ hint and text

つまりコメント文の文頭に+をつける。

hintには下記リストから適切なものを選択する。

 

hintリスト

ALL_ROWS

FIRST_ROWS

RULE

FULL

ROWID

CLUSTER

HASH

INDEX

INDEX_ASC

INDEX_DESC

AND_EQUAL

ORDERED

USE_NL

USE_MERGE

 

Hint詳細

==最適化アプローチに対するヒントと目標==

コストベースまたはルールベースの最適化アプローチを選択することができる。

さらに、コストベースのアプローチでは、最高のスループットまたは最高の応答時間を目標として選択することができる。

SQL文に最適化アプローチと目標を指定するヒントが含まれている場合、オプティマイザは、総計、OPTIMIZER_MODE初期化パラメータの値、およびALTER SESSIONコマンドのOPTIMIZER_GOALパラメータの有無にかかわらず、指定されたアプローチを使用する。

ALL_ROWS

最高のスループットを目標としてコストベースのアプローチを使用する。

FIRST_ROWS

最高の応答時間を目標としてコストベースのアプローチを選択して、文ブロックを最適化する。

全表走査より索引走査を選択

ソート/マージ結合よりネストしたループ結合を選択

ソート処理を避けるために索引走査を選択

RULE

文ブロックに対してルールベースの最適化を選択する。

Memo : ORACLEの将来バージョンでは、ルールベースのアプローチとともに、RULEヒントは利用不可となる。

 

==表のアクセス方法==

FULL(table)

指定された表に対して全表走査を選択する

ROWID (table)

指定された表に対してROWIDによる表走査を選択する

CLUSTER(table)

指定された表をアクセスするためにクラスタ走査を選択する

HASH(table)

指定された表をアクセスするためにハッシュ走査を選択する

INDEX(table index)

指定された表に対して索引走査を選択する。

複数の索引を指定することが可能。

INDEX_ASC(table index)

指定された表に対して索引走査を選択する。文が索引範囲走査をしようする場合、ORACLEは索引付きの値について昇順に索引エントリを走査する。

INDEX_DESC(table index)

指定された表に対して索引走査を選択する。文が索引範囲走査を使用する場合、ORACLEは索引エントリを索引付きの値について降順に走査する。

AND_EQUAL(table index index)

複数の単一列索引の走査をマージするアクセス・パスを使用する実行計画を選択する。

索引は最低2つ指定しなければならないが、5つを超える索引を指定することはできない。

 

==結合順序に対するヒント==

ORDERED

FROM句に指定された順序(左から右)で表を結合する。

 

==結合順序に対するヒント==

USE_NL

内部表として指定した表を使用しているネストしたループ結合によって、別の行ソースに指定したそれぞれの表を結合する。

USE_MERGE

ソート/マージ結合で指定されたそれぞれの表を別の行ソースと結合する。

 

 

覚え書き

・ヒントは、それらが含まれる文ブロックの最適化だけに適用される。

たとえばUNION演算子で結合した2つの構成要素からなる複合問い合わせは合計2つの文ブロックがあることになり、最初の構成要素に指定したヒントは2番目の構成要素には適用されない。

・文ブロックはヒントを含むコメントを1つだけ持つことができる。

誤ったヒント指定は無視されエラーを戻さない。

構文エラーを含むヒントを無視するが、同じコメント内の正しいヒント文は考慮にいれる。

矛盾するヒントの組み合わせを無視するが、同じコメント内で他のヒントを採用。

SQL*Formsバージョン3のトリガーのように、PL/SQLバージョン1を使用する環境では、すべてのヒントが無視される。

・オプティマイザは、コストベースのアプローチを使用しているときだけヒントを認識する。文ブロックに(RULEヒントを除く)ヒントが含まれている場合、オプティマイザはコストベースのアプローチを自動的に使用する。

用語

コストベース

Oracle8ではデフォルト

SQL文内の1個または複数の表内のデータを健勝して、最も促との安いアクセスパスを選択する。(つまり、使用するリソースと時間を最小にする)

ルールベース

一連のルールに基づいてデータアクセスパスの有効性をランク付けする。

スループット