sql >> データベース >  >> RDS >> Oracle

Oracle11gのネストされたループ結合

    目次

    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


    1. 8589934592バイトの許容メモリサイズが使い果たされました

    2. ニージャーク待機統計:PAGELATCH

    3. OpenCartでカスタム配送方法を作成する:パート2

    4. データベースからnull許容のDateTimeを取得する方法