行ID結合のルール
行ID結合は、特殊な形式の入れ子結合です。最適化ルーチンが入れ子結合の代わりに行ID結合を選択するのは、問合わせの最初の条件で第1のテーブルのリテラルを指定する場合です。この値は、第2のテーブルからのセカンダリ インデックスと等結合する少数の行を選択するときに使用されます。
最適化ルーチンは、次の条件の両方が当てはまる場合にのみ、行ID結合を選択できます。
- WHERE句の条件は、第1のテーブルの別の列を第2のテーブルのNUSI、USIまたは結合インデックス(結合インデックスが基本テーブルの行IDを持つ場合)と一致させる必要があります。
- 第2のテーブルのNUSIまたはUSIの値の部分集合だけが結合条件によって限定され(この条件を実行時選択インデックス条件と言います)、2つのテーブルの間で入れ子結合が行なわれ第2のテーブルから行IDを検索します。
行ID結合のプロセス
次の汎用SQL問合わせについて考えてみます。
SELECT * FROM table_1, table_2 WHERE table_1.NUPI = value AND table_1.column = table_2.weakly_selective_NUSI;
このリクエストの結合ステップの解決に関与するプロセスは次のとおりです。
- 条件に合うtable_1の行がすべてのAMP上にコピーされます。
- table_1の行の結合列にある値を使用して、table_2のNUSIにハッシュします(入れ子結合と同様です)。
- インデックス サブテーブルから行IDが抽出されて、対応するtable_1列と一緒にスプールに格納されます。これが結合用の左のテーブルになります。
- すべてのtable_1の行が処理されると、スプールが行IDの順にソートされます。
- 次に、このスプールの行IDを使用して、それに対応するtable_2のデータ行を抽出します。
- table_2のデータ行内のtable_2の値が、行ID結合の行内のtable_1の値と一緒に結果スプールに入れられます。
ステップ2および3は、入れ子結合の一部です。ステップ4、5、および6が、行ID結合を表わします。
次の図は、行ID結合を示したものです。
行ID結合の例
次のSELECTリクエストを実行するとします。第1のWHERE条件は、NUPI上で、第2の条件はNUSI上にあります。最適化ルーチンは、行ID結合を適用して結合を処理します。
SELECT * FROM table_1, table_2 WHERE table_1.column_1 = 10 AND table_1.column_3 = table_2.column_5;