記事ディレクトリ
テーブル接続方法
- 理論的な実行効率:
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;