USE_NLヒントは、
指定された表が内部表として使用されるような結合時に
ネステッド・ループ結合するように指示するヒント句である。
したがって、指定されたテーブルが内部表として使用されない場合には、
USE_NLヒントは無効となる。
通常、オプティマイザは複数の結合順序パターンのコストを評価し、
よりコストの低い実行計画となる結合順序パターンを選択する。
そのため、USE_NLで指定したテーブルが
内部表とならない結合順序のコストより低く評価された結合順序があった場合、
その結合順序が選択されてしまい
結果的にUSE_NLヒントは無効となってしまう。
例:以下の4つのパターンが評価されたとする
※)(外部表)→(内部表)と表現する
プラン1 表A→表B ネステッド・ループ結合 コスト:400
プラン2 表A→表B ハッシュ・ジョイン結合 コスト:300
プラン3 表B→表A ネステッド・ループ結合 コスト:200
プラン4 表B→表A ハッシュ・ジョインン結合 コスト:100
上記の場合、通常もっともコストの低いプラン4が選択される。
プラン4で実行計画が構成された状態から、
USE_NL(表B)を指定して結合方法を強制しようとしても、
表Bは内部表ではないのでUSE_NLヒントは働かない。
しかし、USE_NL(表A)を指定した場合、
表Aは内部表なので、ネステッド・ループ結合が使用される。
PR