目次
Oracleのネストされたループ結合とは
-最初の行ソースの各行について、2番目の行ソースのすべての行にアクセスします。
-NESTED LOOPS結合は、選択した開始行ソースから行を選択し、この行ソースの値を使用する結合操作です。一致する行を検索するために、結合された行ソースにドライブするか、そこから選択します。
-OLTPタイプのトランザクションに最適です
-最初のテーブルから返される行が小さい場合は最速になります
-Oracle 11gのネストされたループ結合の動作は異なります。詳細については、この記事に記載されています
オラクルでネストされたループ結合がどのように機能するか
-Oracleオプティマイザは最初に駆動テーブルを決定し、それを外部ループとして指定します。これが駆動行のソースです。結合条件を駆動するための一連の行を生成します。行ソースは、インデックススキャンまたは全表スキャンを使用してアクセスされるテーブルにすることができます。行は、他の操作からも生成できます。たとえば、ネストされたループ結合からの出力を行ソースとして使用できます。
-オプティマイザは他のテーブルを内部ループとして指定します。これは、外部ループから返されるすべての行に対して繰り返されます。これはテーブルへのアクセス操作であり、理想的にはインデックススキャンである必要があります。
-INNERテーブルによって実行される操作は、OUTERテーブルに返されるすべての行に対して繰り返されます
for x in (select from outer table) loop for row in (select from inner table ) loop joined output rows is returned where condition is matched end loop end loop
ネストされたループ結合の例
select /* +use_nl( a b) */ a.emp_no,b.dept_no,b.dept_name from emp a,dept b where a.dept_no=b.dept_no; SELECT STATEMENT NESTED LOOP TABLE ACCESS FULL DEPT TABLE ACCESS BY INDEX ROWID EMP INDEX RANGE SCAN EMP_N1
処理方法
(1)DEPTの最初の行を読み取ります
(2)EMP_N1でインデックススキャンを実行してdept_noと一致し、最初の行IDを取得します
(3)EMPで参照されている行を探し、情報を結合して提供しますoutput
(4)返された各rowidに対して操作2、3を繰り返します
(5)DEPTのすべての行に対して操作1、2、3、4を繰り返します
for x in(テーブル部門から選択)
loop
for row in(テーブルempから選択)
loop
結合された出力行は、条件が一致した場合に返されます
endループ
ループの終了
ここで、テーブルempから選択するためのアクセス方法は、インデックススキャンを使用します。
オプティマイザが他の結合方法を使用することを選択している場合は、USE_NL(A B)ヒントを使用できます。ここで、AとBはテーブルのエイリアスです。参加しています。
コスト計算
NESTED LOOPS結合では、外側の行セットのすべての行について、内側の行セットにアクセスして、結合するすべての一致する行を検索します。したがって、このタイプの結合では、内側の行セットは外側の行セットの行数と同じ回数アクセスされます。
コスト :テーブルAにアクセスするためのコスト+テーブルAから返された行の数XテーブルBにアクセスするためのコスト
したがって、これは、外側のテーブルから小さな行が返され、内側のテーブルへのアクセス操作が一意のスキャンまたは小さなインデックス範囲のスキャンを介して行われる場合に費用効果が高くなります
Oracle11gでのネストされたループ結合の新しい方法
SELECT STATEMENT NESTED LOOPS NESTED LOOPS TABLE ACCESS FULL DEPT INDEX UNIQUE SCAN EMP_IDX TABLE ACCESS BY INDEX ROWID EMP
Oracleのドキュメントにはこれが記載されています
インデックスまたはテーブルブロックがバッファキャッシュになく、結合を処理するために必要な場合、物理I/Oが必要です。 Oracle Database 11gリリース1(11.1)では、OracleDatabaseは複数の物理I/ O要求をバッチ処理し、一度に1つずつ処理するのではなく、ベクトルI/Oを使用して処理できます。ネストされたループ結合の新しい実装の一部として、2つのNESTED LOOPS結合行ソースが実行プランに表示される場合がありますが、以前のリリースでは1つしか表示されませんでした。このような場合、Oracle Databaseは、1つのNESTED LOOPS結合行ソースを割り当てて、結合の外側のテーブルの値を内側のインデックスと結合します。 2番目の行ソースは、最初の結合の結果を結合するために割り当てられます。これには、oracleインデックスに格納されているROWIDが含まれ、結合の内側にテーブルがあります。」
Oracleのネストされたループの外部結合
-ネストされたループと同様
-内側のループに基準を満たす行がない場合でも返される行
-いずれかのテーブルから駆動される可能性のあるネストされたループとは異なり、これは一方向の結合です
a =b(+)は常にbの前に移動します。これにより、より高額なプランが発生する可能性があります(おそらく非NL)
(+)は常に不十分な側になります
また読む
ハッシュ結合
Oracleの結合メソッド
https://en.wikipedia.org/wiki/Nested_loop_join