オプティマイザは、SQLを解析して、実行計画を作成します。
「オプティマイザ」については下記の記事でも解説しています。
しかし、意図したとおりの実行計画を作成してくれないケースがあります。
その際に使用するのが、「ヒント句」になります。
オプティマイザはどのような時に最適な実行計画を作ってくれない?
- オプティマイザ統計が古くて実態とかけ離れている場合
- 複雑すぎるSQLの場合(結合が5つ以上あるような)
ヒント句とはどのようなものか?
あらかじめ、SQLに設定することで、統計情報が完全に取得できてない場合でも、最適な実行計画になるようにオプティマイザを導きます。
構文
1 |
/*+ ヒント内容 */ |
具体例
select文のselect句の後などに追加します。こうすることで指定したテーブルに対して指定したインデックスでインデックススキャンを実施します。
1 |
select /*+ INDEX(users user_id)*/ * from users |
もし、「テーブル名 as t」などと別名を使用していた場合はヒント句には別名を指定しないと動かないので注意です。(別名を使っていない場合は実テーブル名の指定で問題ないです。)
ヒントの種類
ヒント | 説明 |
---|---|
CHOOSE | オプティマイザモードをCHOOSEにする。 |
RULE | RBO固定にする。 |
FIRST_ROWS | オプティマイザモードをFIRST_ROWSにする。 |
ALL_ROWS | オプティマイザモードをALL_ROWSにする。 |
FULL(<テーブル名>) | 指定されたテーブルのフルテーブルスキャンを行う。 |
INDEX(<テーブル名><索引名>) | 指定されたテーブルのアクセスに指定された索引を使用する。 |
INDEX_DESC(<テーブル名><索引名>) | 指定されたテーブルのアクセスに指定された索引を逆順に使用する。 |
USE_NL(<テーブル名>) | 指定されたテーブルが結合される際に、ネステッドループ結合を使用する。 |
USE_MERGE(<テーブル名>) | 指定されたテーブルが結合される際に、ソート/マージ結合を使用する。 |
USE_HASH(<テーブル名1><テーブル名2>) | 指定されたテーブルが結合される際に、ハッシュ結合を使用する。 |
ORDERED | FROM句に記述された順番でテーブルを結合する。 |
たくさんありますが、実際によく使うヒント句はそう多くないです。(INDEX、FULL、USE_HASHなど)
ヒントの中に出てくる、「テーブルのスキャン」に関する用語については下記の記事でも解説しています。
この記事へのコメントはありません。