[SQLチューニング]お勉強⑤~ヒント句~

適切なヒント句が使えるようになるとできる人にみえるよね。

オプティマイザに実行方法を直接指示する方法です。

1.記述箇所

“SELECT”、”UPDATE”、”INSERT”、”DELETE”の後ろに”/*+ <ヒント> */”で記述する。

2.主要なヒント句一覧

 

ヒント句 概要
CHOOSE オプティマイザモードをCHOOSEに設定する(※1)
RULE 統計情報の有無にかかわらず、RBOで動作する
FIRST_ROWS オプティマイザモードをFIRST_ROWSに設定する
FIRST_ROWS(<最適行数>) オプティマイザモードをFIRST_ROWS_nに設定する
ALL_ROWS オプティマイザモードをALL_ROWSに設定する
FULL(<テーブル名>) 指定されたテーブルのフルテーブルスキャンを行う
INDEX(<テーブル名> <インデックス名>) 指定されたテーブルへのアクセスに指定されたインデックスを使用する(※2)
INDEX_DESC(<テーブル名> <インデックス名>) 指定されたテーブルへのアクセスに指定されたインデックスを逆順に使用する
INDEX_FFS(<テーブル名> <インデックス名>) 指定されたテーブルへの高速全索引スキャンを行う。
USE_NL(<テーブル名>) 指定されたテーブルが結合されるときにネステッド・ループ結合を使用する
USE_MERGE(<テーブル名>) 指定されたテーブルが結合されるときにソート/マージ結合を使用する
USE_HASH(<テーブル名1> <テーブル名2>) 指定したテーブルが結合されるときにハッシュ結合を使用する
ORDERED FROM句に記述された順番でテーブルを結合する
LEADING(<テーブル名1> <テーブル名2>) 指定した順番でテーブルを結合する

※1.オプティマイザモード

モード 概要
CHOOSE デフォルト値。SQLの対象テーブルに1つでも統計情報があればCBO、1つもなければRBOとなる。CBOの動きはALL_ROWSと同じ。
RULE 統計情報の有無に関係なく強制的にRBO
FIRST_ROWS 最初の1行の応答時間を最小に抑える実行計画を選択する。統計情報の有無に関係なくCBO
FIRST_ROWS_n 最初のn行の応答時間を最小に抑える実行計画を選択する。統計情報の有無に関係なくCBO
ALL_ROWS 全体の応答時間を最小に抑える実行計画を選択する。統計情報の有無に関係なくCBO

※2.INDEXヒントの記述方法

(1) ヒントを複数記述する

SELECT /*+ INDEX(e PK_EMP) INDEX(d IDX_EMP1) */

テーブルeに対しインデックス「PK_EMP」を使用し、テーブルdに対しインデックス「IDX_EMP1」を使用する。
INDEXヒント以外でも複数ヒントは同じ記述。

(2) 括弧内に複数のインデックスを記述する

SELECT /*+ INDEX(e PK_EMP IDX_EMP1) */

「PK_EMP」と「IDX_EMP1」の適切な方をオプティマイザに選択させる。

※3.カンマ

INDEXヒントのテーブル名とインデックス名、LEADINGヒントのテーブル名の間にカンマ(,)を入れてもいい。入れなくてもいい。