OracleのSQL文では、オプティマイザー(が実行計画を立てるの)を助けるヒントというものを書くことが出来る。
|
SELECT・UPDATE・DELETE文において、「SELECT」「UPDATE」といった語の直後にヒントを書く。
コメントの記号「/*」の直後に「+」を付けるとヒントになる。
また同様に、行コメント「--」の直後に「+」を付けてもヒントになる。
select /*+ ヒント */ 項目,… from テーブル;
select --+ ヒント 項目,… from テーブル;
一見すると普通にコメントの様に見える。
実際、ヒントの書き方が間違っていてもコメントとして無視されるようで、エラーになったりしない。そういう意味でちょっと分かりにくい。
したがって、ヒントを書いたら、EXPLAIN文やSQL*PlusのAUTOTRACEを使って
思い通りの実行計画になったかどうかを確認しなければならない。
ヒントの中には、ヒントの対象となるテーブルを指定するものがある。
この場合、from句に書かれているテーブル名をそのまま指定しないといけないらしい。すなわち別名を定義している場合は その別名を書く。
from | ヒント | 結果 |
---|---|---|
emp |
emp |
○ |
emp e |
emp |
× |
emp e |
e |
○ |
scott.emp |
scott.emp |
× |
scott.emp |
emp |
○ |
ただ、from句でスキーマ名を指定した場合(「scott.emp
」)は ヒントではスキーマ名を付けてはいけないようだ。
インデックス(索引)を使うように指示するヒントは、INDEXを使う。
select /*+ INDEX(テーブル名 インデックス名) */ * from テーブル名;
テーブル名とインデックス名の間には空白を入れて区切るが、カンマで区切ってもいいようだ。
逆にインデックスを使わない(フルスキャンを行う)ように指示するヒントは、FULLを使う。
select /*+ FULL(テーブル名) */ * from テーブル名;