結合ジオグラフィは、結合の実行に必要な行の再配置が実行される場合に、それを説明するための用語です。結合される2行については、同じAMP上に存在しなければならず、最適化ルーチンは最もコストの低い行の再配置戦略を判別する必要があり、任意の結合内の2つのリレーションの相対カーディナリティは、考慮すべき主要なコストになることを覚えておいてください。これは最適化ルーチンが使用できる最新の統計を持つように促す主要な要因です。
結合分散戦略
- 再配置、並替え、またはその両方を実行する必要のある行の数の結果に応じて、結合コストは増大する。
- リレーションの同じペアの結合計画は、それらのリレーションのデモグラフィック特性の変更の結果に応じて変更される可能性がある。
- 結合内の1つまたは両方のリレーションのハッシュ ベースの再分散。
注目すべきEXPLAIN句は再分散です。
- 結合内の1つまたは両方のリレーションのコピー。
注目すべきEXPLAIN句はコピーです。
- リレーションのローカルでの構築。
注目すべきEXPLAIN句はローカルな作成です。
- リレーションの1つのランダムな再分散。
リレーションを再配置した後、リレーションをソートする必要がある場合があります。 注目すべきEXPLAIN句はソートです。
5番目のオプションもありますが、これは行を再分散させるためのものではありません。このオプションは、行の再分散の逆の過程を表わします。これは結合の実行に再分散は必要なく、2つのリレーションのプライマリ[AMP]インデックスが、両方のリレーションの等価値行が同じAMPにハッシュされるという場合にのみ生じます。
さまざまな行再分散戦略の例
以下の一連の例は、4つの異なる行再分散置戦略を示しており、3つはマージ結合を使用し、4つ目のものはプロダクト ジョインを使用します。
1つのテーブルの行をマージ結合用に再分散する
この例はマージ結合戦略を示しています。これには1つのテーブルの行のハッシュ再分散と、結合列の行ハッシュ値によりそれらを並べ替えることが含まれています。再配置戦略は、クエリー内の結合条件が結合テーブルのプライマリ インデックスの1つにのみ基づくために実行されます。
マージ結合を生成するクエリーは、次のとおりです。
SELECT * FROM employee AS e INNER JOIN department AS d ON e.dept = d.dept;
enum (PK, UPI) |
Name | dept (FK) |
---|---|---|
1 | Higa | 200 |
2 | Kostamaa | 310 |
3 | Chiang | 310 |
4 | Korlapati | 400 |
5 | Sinclair | 150 |
6 | Kaczmarek | 400 |
7 | Eggers | 310 |
8 | Challis | 310 |
dept (PK, UPI) |
Name |
---|---|
150 | Payroll |
200 | Finance |
310 | Manufacturing |
400 | Engineering |
この例は4-AMPシステム上で実行されます。クエリーは、等結合条件を両方のテーブルのdept列に対して使用します。システムはEmployeeテーブルの行をスプールにコピーし、それらをe.deptの行ハッシュで再分散します。マージ結合は、結合される行が同じAMP上に存在するように再配置された後に実行されます。
再配置戦略は、テーブルの1つが結合列の行ハッシュで分散済みの場合に実行されます。マージ結合は、テーブルの1つ(dept、両方ではない)のプライマリ インデックスである結合列により実行されます。
すべてのAMP上の小さいほうのテーブルの行をコピーして並べ替え、マージ結合用に大きい方のテーブルのローカル コピーを作成して並べ替えます。
この例では、さまざまなマージ結合戦略を示していますが、これはすべてのAMP上の結合で小さい方のテーブルをコピーして並べ替え、大きい方のテーブルのコピーをローカルに作成してEmployeeテーブルの行ハッシュ上で並べ替えるというプロセスで構成されます。
この例で使用される問合わせとテーブルは、1つのテーブルの行をマージ結合用に再分散するで使用されているものと同じですが、テーブルの統計は異なっているため、最適化ルーチンは異なる結合ジオグラフィ戦略を実行します。最適化ルーチンは、入手可能な統計から小さいほうのテーブルをコピーして並べ替えるほうが、大きいほうのテーブルをハッシュして再分散させるよりもコストが低くなると判断した場合、以下のシナリオに従って戦略を選択します。
システムはまずdepartmentテーブルをコピーし、それをすべてのAMPのdept列に基づいて並べ替えます。次に、Employeeテーブルをローカルに作成し、deptの行ハッシュ値に基づいて並べ替えます。
このプロセスの最終ステップは、実際のマージ結合操作の実行です。
両方のテーブルの結合行が同じAMP上にあるために、マージ結合用の行の再分散または並替えを実行しない
この例では、マージ結合戦略も示しています。この特定の戦略では、両方のテーブルの結合行が同じAMPにハッシュされるので、行のコピーまたは並替えは必要ありません。これは、一方のテーブルのUPIと同じ定義域上の、もう一方のテーブルのNUPIの良い使用例です。これにより、同じプライマリ インデックス値を持つ行は必ずすべて同じAMPにハッシュされます。結合条件がそれらのプライマリ インデックスに対するものである場合、結合される行はすでに同じAMP上にあるので、再配置または並替えを実行する必要はありません。システムが実行すべきことは、すでに適切なAMP上にある行の比較だけです。
この例は4-AMPシステム上で実行されます。
このマージ結合戦略を生成する問合わせは、次のとおりです。
SELECT * FROM employee AS e INNER JOIN employee_phone AS p ON e.num = p.num;
結合される2つのテーブルは、次のように定義されます。
enum (PK, FK, NUPI) |
name (PK) |
dept (PK) |
---|---|---|
1 | Higa | 200 |
2 | Kostamaa | 310 |
3 | Chiang | 310 |
4 | Korlapati | 400 |
5 | Sinclair | 150 |
6 | Kaczmarek | 400 |
7 | Eggers | 310 |
8 | Challis | 310 |
enum | area_code | phone |
---|---|---|
1 | 213 | 5551576 |
2 | 213 | 5550703 |
3 | 408 | 5558822 |
4 | 415 | 5557180 |
5 | 312 | 5553513 |
6 | 203 | 5557461 |
7 | 301 | 5555885 |
8 | 301 | 5551616 |
プロダクト ジョイン用に小さいほうのテーブルをすべてのAMP上にコピーする
この例はプロダクト ジョイン戦略を示しています。これには4-AMPシステムのすべてのAMP上で、小さい方のテーブルの行をコピーすることが含まれています。この例で使用されるテーブルは、1つのテーブルの行をマージ結合用に再分散するで使用されているものと同じです。
次の問合わせは、プロダクト ジョインを生成します。
SELECT * FROM employee AS e INNER JOIN department AS d ON e.dept > d.dept;
プロダクト ジョインは、不等結合条件e.dept > d.deptにより実行されます(プロダクト ジョインを参照)。使用可能な統計に基づいて、最適化ルーチンはdepartmentテーブルが結合内の小さい方のテーブルであると判断するため、そのすべての行のコピーを各AMPに分散させる結合計画を考案します。UPI enum値でハッシュ分散されるEmployeeテーブルの行は、再分散されません。プロダクト ジョイン操作は、Employeeテーブル内のすべての行を、コピーされたdepartmentテーブル内のすべての行と比較した後に、クエリーに対する指定の結合条件を満たす行だけを返します。
再配置のシナリオ
プライマリ インデックスは、2つのテーブルを結合する方法と、どの行を再配置するかを決定する際に、最適化ルーチンが用いる主要な考慮事項です。ただし、テーブルにプライマリ インデックスがない場合は、その他の判断基準を検討する必要があります。
プライマリ インデックス付きの2つのリレーションが、マージ結合方式を使用して結合される場合、3つの一般的なシナリオを実行できます(マージ結合を参照)。これについては、次のテーブルで説明します。
次のシナリオでは最良のものから順にランクしています。1が最良であり、この場合の最良とは最もコストが低いことを意味します。
ランク | シナリオ | 結合列のセット | 対象となる結合操作のリレーション |
---|---|---|---|
1 | 1 | プライマリ[AMP]インデックス | 両方 |
2 | 2 | プライマリ[AMP]インデックス | 1つ |
3 | 3 | プライマリ[AMP]インデックスではない | どちらも非対象 |