マージ結合では、等式結合を処理することで2つのテーブルから行を取得します。この等式結合は、結合対象の一方のテーブルに含まれる適合行の行キーまたは行ハッシュの値を使用して他方のテーブルを調査します。マージ結合は、調査対象のテーブルが行キーまたは行ハッシュのどちらかで格納されていることを仮定します。その後、結合列の行キーまたは行ハッシュに基づいて、結合された行を共通のAMPに配置する操作が実行されます。Teradata Databaseは、各行を結合列の行キーまたは行ハッシュの順序に並べ替えてから、結合列の行キーまたは行ハッシュ値が一致する行を結合します。
マージ結合では、テーブルの照合基準となる列が、両方のテーブル(すなわち、再分散されたテーブルのスプール)を実際に順序付けるための列としても使用されます。マージ結合では、必要な比較操作が少なく、また両方のテーブルのブロックを1回しか読み取らないため、通常はプロダクト ジョイン(プロダクト ジョインを参照)よりも効果的です。
マージ結合の方法
- 高速パス内部マージ結合
高速パス内部包含マージ結合
- 低速パス内部マージ結合
低速パス内部包含マージ結合
- 排他マージ結合
- 高速パス左外部マージ結合
高速パス左外部包含マージ結合
- 低速パス左外部結合
低速パス左外部包含マージ結合
- 高速パス右外部マージ結合
- 低速パス右外部マージ結合
- 完全外部マージ結合
- 直接マージ結合
- Rowkeyベースのマージ結合
- シングル ウィンドウ マージ結合
- スライディング ウィンドウ マージ結合
マルチレベルのパーティション化されたテーブルのマージ結合では、動的行パーティション排除がサポートされていません。 詳細については、動的行パーティション排除による積結合と<Teradata Vantage™ - データベースの設計、B035-1094>を参照してください。
行パーティション化されたPIテーブルを一致しないリレーションにマージ結合するための方法
- 従来のマージ結合に備えて、行パーティションPIテーブル(または両方の行パーティションPIテーブル)を非パーティション スプールにスプールする。
- 行キー ベースのマージ結合に備えて、非パーティション テーブル(または2つの行パーティションPIテーブルのうちの1つ)を行パーティションPIスプールにスプールし、残りのテーブルに同一のパーティション化を行なう(Rowkeyベースのマージ結合を参照)。
このオプションは常に利用できるわけではありません。
- いずれのテーブルもスプールしないで、テーブルのスライディング ウィンドウ マージ結合を使用する(スライディング ウィンドウ マージ結合を参照)。
この場合、両方のテーブルには同じプライマリ インデックスが必要です。また、結合はプライマリ インデックス列間で等価結合でなければならず、どちらも列パーティション化することはできません。
すべての場合において、最適化ルーチンは、すべての合理的な結合戦略を検討して、最も見積もりコストが少ない戦略を選択します。
汎用的なマージ結合戦略
マージ結合アルゴリズムにより適用される高レベル プロセスは、以下の通りです。
- 結合するペアの小さいほうのリレーションを識別します。
- 最適化ルーチンは、条件が満たされた行をスプールに入れることが必要な場合にのみ、以下のステップを実行します。
- 条件を満たす行を1つまたは両方のリレーションから、個別のスプールに入れる。
条件を満たす行がスプールに配置されるので、結合列のセットの行キーまたはハッシュに基づいて、これらをそのターゲットAMPに再配置します。
- その結合列の行キーまたは行ハッシュ値の、条件を満たすスプール行を並べ替える。
- 条件を満たす行を1つまたは両方のリレーションから、個別のスプールに入れる。
- 再配置された行セットを、他のリレーション内の対応する結合列の行ハッシュ値と比較します。
行パーティション化されたPIテーブルのプライマリ インデックス列の等価結合条件を使用したマージ結合のための動的行パーティション排除
単一レベルの行パーティション化されたPIテーブルのすべてのプライマリ インデックス列に等価結合条件があり、さらにパーティション列に特定の形式の範囲結合条件がある場合、最適化ルーチンは、動的パーティション排除によるマージ結合を使用して結合を実行します。
これは、結合される他のテーブルが行パーティション化されたPIテーブルと同じ方法でパーティション化され、1つのテーブルのパーティションのサブセットが指定した範囲条件に従って他のテーブル内のパーティションのサブセットと結合される、行パーティション化されたPIテーブルとのスライディング ウィンドウマージ結合(スライディング ウィンドウ マージ結合を参照)の1つの形式と考えることができます。
- ppi_t1.partitioning_column_1 + C1 <operator> ppi_t2. partitioning_column_2
- ppi_t2. partitioning_column_2 <operator> ppi_t1.partitioning_column_1 + C2
- ppi_t1.partitioning_column_1 + C1 <operator> ppi_t2. partitioning_column_2
- ppi_t2.non_partitioning_column_2 <operator> ppi_t1.ppi_column_1 + C2
説明
構文の要素 | 指定内容 |
---|---|
<operator> | 次のいずれかの結合演算子です。
|
ppi_t1.partitioning_column_1 | テーブルppi_t1のパーティション列。 |
C1 | 定数。 |
ppi_t2. partitioning_column_2 | テーブルppi_t2のパーティション列。 |
C2 | 定数。 |
ppi_t1.ppi_column | テーブルppi_t1のパーティション列。 |
ppi_t2.non_partitioning_column | テーブルppi_t2のパーティション列。 |
文字パーティション化されたテーブルに対してはサポートされない動的行パーティション排除を使用したマージ結合
文字列を算術的に合算することはできず、文字列の間隔が定義されていないので、動的行パーティション排除を使用したマージ結合は文字パーティション化されたテーブルではサポートされません。
低速パス内部マージ結合
低速パス マージ結合アルゴリズムにより適用されるプロセスは、以下のとおりです。
- 左のテーブルから各行を読み取ります。
- 左のテーブルの各行を、同じハッシュ値を持つ右のテーブルの行と結合します。
高速パス内部マージ結合
高速パス マージ結合アルゴリズムにより適用されるプロセスは、以下のとおりです。
- 左の行から行を読み取り、そのハッシュ値を記録します。
- 右のテーブルから、ハッシュ値>=左のテーブルの行のハッシュ値になっている次の行を読み取ります。
行のハッシュ値 | 結果 |
---|---|
等しい | 2つの行を結合する。 |
等しくない | 大きいほうの行ハッシュ値を使用して、他のテーブルから行を読み取る。 |
次の図は、一般的な高速パス マージ結合プロセスを表わしています。
マージ結合分散戦略
マージ結合では、次のいずれかの分散方式が用いられます。
戦略番号 | 戦略名 | ステップ | プロセス |
---|---|---|---|
1 | ハッシュ再分散 | 1 | 一方または両方のテーブル(結合で使用されるプライマリ インデックスによって異なる)をいくつかの、またはすべてのAMPにハッシュ再分散する。 テーブルの結合列にプライマリAMPがある場合、Teradata Databaseはハッシュ再分散を使用する代わりにローカルでスプールすることができます。ただし、その場合でもテーブルのステージ2は必要です。 |
2 | それらの行を結合列の行ハッシュの順序に並べ替える。 | ||
2 | コピー | 1 | 小さいほうのテーブルをすべてのAMP上にコピーする。 |
2 | それらの行を結合列の行ハッシュの順序に並べ替える。 | ||
3 | もう一方のテーブルを各AMP上でコピーして、それらの行を結合列の行ハッシュの順序に並べ替える。 | ||
3 | インデックスの一致 | 1 | プライマリ インデックスが一致し、それらが結合列になっている場合には、再分散は不要。 |
マージ結合の例
次のSELECTリクエストでは、employeeテーブルとdepartmentテーブルを、両方のテーブルのdept_no値が等しいという条件でマージ結合して、どの従業員がどこで作業しているかを特定します。
SELECT name, dept_name, loc FROM employee INNER JOIN department WHERE employee.dept_no = department.dept_no;
このマージ結合の処理の各ステップについて、以下に詳しく説明します。
- department行はdept_noのハッシュ コード(Departmentテーブルの固有プライマリ インデックス)に従って分散されるため、従業員の行は自身のdept_noの値のハッシュ コードによって再分散されます。
- 再分散された従業員の行は各AMP上のスプールに格納され、dept_noのハッシュ値に基づいてソートされます。
これにより、AMP上のdepartment行と同じ順序になります。
- 従業員のスプールから同じかまたはより大きな行ハッシュを持つ最初の行を読み取るために、Departmentテーブルの最初の行のハッシュ値が使用されます。
すなわち、可能な場合には、マージ結合のどちらのテーブルの行もスキップされます。
- ハッシュ コードが一致する場合には、一致した行に対して、ハッシュ値だけではなくdept_noの値も等しいかどうかを調べるための別のテストが行なわれます。
- ハッシュ コードが一致しない場合には、2つのハッシュ コードのうちの大きいほうのコードを用いて、別のテーブルに位置付けます。
ハッシュ コードとハッシュ値の照合は、いずれかのテーブルの終わりに達するまで続けられます。
- 各AMP上で、条件を満たす各行の名前、dept_no、およびlocの値が結果スプールに格納されます。
- 最後のAMPがマージ結合を完了すると、すべての結果スプールの内容がマージされて、ユーザーに返されます。
制約を満たすことに失敗する行が多い場合、ハッシュ一致再配置プロセスは複数の行をスキップします。条件を満たさない行のスキップは、マージ結合の実行時間を短縮します。これは、特にテーブルが非常に大きい場合に当てはまります。
次の図は、このマージ結合プロセスを表わしています。
後続のマージ結合の例には、次のテーブル定義を使用します。
e_num | e_name | dept |
---|---|---|
1 | Brown | 200 |
2 | Smith | 310 |
3 | Jones | 310 |
4 | Clay | 400 |
5 | Peters | 150 |
6 | Foster | 400 |
7 | Gray | 310 |
8 | Baker | 310 |
e_num列はテーブルのUPIおよびPKで、deptはFKです。
dept | dept_name |
---|---|
400 | Education |
150 | Payroll |
200 | Finance |
310 | Mfg |
dept列は、テーブルのUPIとPKです。
これらのテーブルに対して次のSELECTリクエストを実行する場合は、マージ結合行の再分散方式の任意のが使用されます。
SELECT * FROM employee INNER JOIN department WHERE employee.dept = department.dept;
マージ結合行の分散(ハッシュ再分散)
次の図は、ハッシュ再分散を使用したマージ結合行の分散を示しています。
マージ結合行の分散(テーブルのコピー)
次の図は、テーブルのコピーによるマージ結合行の分散を示しています。
この例では、次の従業員とemployee_phoneテーブル定義を使用します。
e_num | e_name |
---|---|
1 | Brown |
2 | Smith |
3 | Jones |
4 | Clay |
5 | Peters |
6 | Foster |
7 | Gray |
8 | Baker |
列e_numは、テーブルのUPIとPKです。
e_num | area_code | phone |
---|---|---|
1 | 213 | 4950703 |
1 | 408 | 3628822 |
3 | 415 | 6347180 |
4 | 312 | 7463513 |
5 | 203 | 8337461 |
6 | 301 | 6675885 |
8 | 301 | 2641616 |
8 | 213 | 4950703 |
列e_numはテーブルのNUPIとFKで、3つの列すべてでPKを構成します。
これらのテーブルに対して次のSELECTリクエストを実行すると、インデックスの一致による行分散の戦略が使用されます。
SELECT * FROM employee INNER JOIN employee_phone WHERE employee.e_num = employee_phone.e_num;