SQLヒントで実行計画を固定するときに意識するポイントは
- テーブルの結合順序
- テーブルの結合方法
- テーブルへのアクセス方法
の3つです。
#1.テーブルの結合順序
- ORDEREDヒント または LEADINGヒント で結合順序を固定します。
- 駆動表(最初にアクセスされているテーブル)がアクセスするテーブルの中で、
もっとも件数が少なく絞り込めるテーブルとなっているかを見ます。 - WHERE句の結合条件に従って適切な順序となったいるかを見ます。これが適切でないと直積が発生(実行計画では「MERGE JOIN CARTESIAN」が表示)します。
#2.テーブルの結合方法
- USE_NLヒント(NestedLoop結合) または USE_HASHヒント(Hash結合)で結合方法を固定します。
- (例外はありますが)、数百件程度に検索結果が絞り込めるような小規模の問い合わせでは
NestedLoop結合を使用し、それ以上の大規模の問合せの場合にはHash結合を使用します。 - 基本的には、一つの問合せ(SELECLT文)でいずれかの結合方法に統一されているのが望ましいです。
#3.テーブルへの走査方法
- INDEXヒント(INDEX SCAN) または FULLヒント(TABLE FULL SCAN) でアクセス方法を固定します。
- NestedLoop結合の場合にはINDEX SCANしているかどうかを確認します。
このとき、実行計画で「INDEX FULL SCAN」とならずに「INDEX UNIQUE SCAN」「INDEX RANGE SCAN」となっていることを確認します。 - Hash結合の場合にはFULL SCANしているかどうかを確認します。このとき、実行計画で「TABLE FULL SCAN」もしくは「INDEX FAST FULL SCAN」となっていることを確認します。
また、これらの3つのポイントを意識をして実行計画が適切かどうかを判断することも出来ます。
これらのポイントをはずしている実行計画をもつSQLは、統計情報の取得やヒント句の指定による実行計画を修正することによるパフォーマンス改善が必要な可能性が高いSQLといえます。