Oracleネストループ、ハッシュ結合、ソートマージ結合详解

テーブル接続方法

  • 理論的な実行効率:hash join > nested loops > sort merge join
  • CBOオプティマイザでは、テーブル接続方法は固定されておらず、hintキーワードを使用して強制的に変更できます。
  • 最適化の原則:最小IO消費
テーブル接続方法 動作原理 適用原理
ネストされたループ 2レベルのネストされたループ 1.ドライブテーブルのデータ量<1W2
。ルックアップテーブルにはインデックスがあります
ハッシュ結合 小さい方のテーブルはRAMにハッシュテーブルを作成し、大きい方のテーブルはレコードを読み取ります。これが最も効率的です。 1.同等の接続
2.駆動計が大きいほど効果が良くなります。駆動計が小さいほど効果が良くなり
ます。3。パラメータHASH_AREA_SIZEを設定する必要があります。
ソートマージ結合ソートマージ結合 レコードを並べ替えてマージ 1.非等価の結合またはソート
スタージョインスタージョイン 複数のディメンションテーブルと大きなデータテーブル、そしてネストされたループ接続 1.一般的にデータウェアハウスに使用されます
2.パラメーターSTAR_TRANSFORMATION_ENABLEDを有効にする必要があります

ここに写真の説明を挿入

ネストされたループ

  • あるテーブルから周期的にデータを読み取り(駆動テーブルの外側のテーブル)、次に別のテーブルにアクセスします(内側のテーブルが検索されます通常有索引)。駆動テーブルの各行は、内部テーブルの対応するフィールドに関連付けられています。
FOR o IN 1 .. n LOOP -- 一般 n < 1W
  FOR i IN 1 .. m LOOP
     索引字段 join;
  END LOOP;
END LOOP

-- 内部连接过程
row source1 的 row1 -> probe -> row source2
row source1 的 row2 -> probe -> row source2
row source1 的 row3 -> probe -> row source2
...
row source1 的 rowN -> probe -> row source2

ハッシュ結合

  • この接続方法はOracle7.3で導入され、CBOオプティマイザーでのみ使用できます。
  • ネストされたループには、いわゆるドライバーテーブルの概念もあります。ハッシュテーブルとビットマップによるテーブルがドライバーテーブルです。構築されたハッシュテーブルとビットマップをメモリに格納できる場合、この接続方法は非常に効率的です。
-- 内部连接过程
row source1 的 row1 -> build hash table and bitmap -> probe -> row source2
row source1 的 row2 -> build hash table and bitmap -> probe -> row source2
row source1 的 row3 -> build hash table and bitmap -> probe -> row source2
...
row source1 的 rowN -> build hash table and bitmap -> probe -> row source2

ソートマージ結合ソートマージ結合

  • 最初に関連テーブルの関連列を並べ替えてから、それぞれの並べ替えられたテーブルからデータを抽出して、別の並べ替えられたテーブルと一致させます。
  • マージ結合はより多くの並べ替えを行う必要があるため、より多くのリソースを消費します。一般的に、マージ結合を使用できる場合、ハッシュ結合はパフォーマンスを向上させることができます。つまり、ハッシュ結合の効果は、ソートマージ結合よりも優れています。ただし、行ソースがソートされている場合は、ソートマージ接続を実行するときに再度ソートする必要はありません。現時点では、ソートマージ接続のパフォーマンスはハッシュ接続よりも優れています。

ヒントキーワード

  • 注構文をチェックしてください:select /*+ hint*/ .../* 和 +選択が続かなければならないの間と後にスペースなし、そうでない場合は無効
  • テーブルエイリアスを使用する:テーブルエイリアスが指定されている場合、テーブル名は使用できません
  • 無視するように促す:間違っている場合はコメントとして扱われ、機能しません
テーブル接続の一般的なヒントキーワード 機能説明
/*+ LEADING(t)*/ 指定されたテーブルtを接続シーケンスの最初のテーブルとして使用します
/*+ USE_NL(t1 t2)*/ t1、t2にネストされたループを使用するように強制します
/*+ USE_HASH(t1 t2)*/ t1、t2にハッシュ接続を使用するように強制します
/*+ USE_MERGE(t1 t2)*/ t1、t2にソートマージを使用するように強制します
/*+ PARALLEL(t N)*/ パラレル、テーブルt、同時番号N
/*+ INDEX(t idx)*/ インデックス、テーブルt、インデックス名idx
SELECT /*+ leading(t1) use_hash(t1 t2)*/
 t1.*
  FROM table_a t1, 
       table_b t2
 WHERE t1.a = t2.a;

おすすめ

転載: blog.csdn.net/qq_34745941/article/details/96476848