積結合の定義
プロダクト ジョインでは、あるリレーションの条件を満たしているすべての行が他のリレーションの条件を満たしているすべての行と比較され、その結果WHERE述部フィルタを満たしている行が保存されることになります。結合内の左のリレーションのすべての行は、右のリレーションのすべての行と比較する必要があるので、システムは必ず小さいほうのリレーションをすべてのAMP上にコピーし、スプール全体が使用可能なメモリに収まらない場合は、システムは複数回、同じデータ ブロックを読み取る必要があります。同じデータ ブロックを複数回読み取る操作は、コストが高くつきます。
比較する回数が2つのリレーション内の条件に合う行数の代数積になるため、この結合を積結合と呼びます。
- WHERE句が問合わせに指定されていない。
- 結合が不等条件に基づいている。
- OR演算された結合条件がある。
- 参照リレーションが結合条件で指定されていない。
- 積結合がその状況で使用できる最もコストの低い結合方式である。
積結合タイプ
- 内部積結合
- 左外部積結合
- 右外部積結合
- 完全外部積結合
- 積み重ね積結合
- 包含プロダクト ジョイン
IN用語での積結合についてのみ使用されます。
- 内部包含プロダクト ジョイン
- 外部包含積結合
- 排他プロダクト ジョイン
NOT IN用語での積結合についてのみ使用されます。
動的列パーティション排除を使用する排他積結合はサポートしていません。
- 内部排他積結合
- 外部排他積結合
積結合の処理
積結合処理の概要を、以下に示します。
- 左リレーションの行をキャッシュに入れます。
- 右リレーションの各行を、キャッシュに入れた左リレーションの各行と結合します。
全体結合条件とは、次の例に示すように、それぞれのリレーションに共通の列に基づいて結合されるリレーションを関連付けるWHERE制約です。
WHERE employee.deptno=department.deptno
次の図は、一般的なプロダクト ジョインのプロセスを表わしています。
次の図は、Projectテーブルの行がすべてのAMPと重複しているプロダクト ジョインを示しています。
積結合のコスト
比較操作の回数が多いため、積結合は、他のタイプの結合よりも時間がかかります。
通常、プロダクト ジョインはシステム リソースの点から見て最もコストがかかる結合方法であるので、より効率的な結合方法、すなわち、マージ結合、ハッシュ結合、入れ子結合などを使用できない場合にのみ使用されます。ただし、結合条件を任意に組み合わせるような場合には、プロダクト ジョインが役に立ちます。
動的行パーティション排除による積結合
データベースは問合わせが既に最適化された後、AMP内の積結合に動的行パーティション排除(DPE)を実行します。この場合、実行される行パーティション排除はディスク上の実際のデータに依存し、そのデータの統計的見積もりには依存しません。
直接積結合という用語は、該当するテーブルまたは結合インデックスが、プロダクト ジョインに備えてスプールされない代わりに、直接結合される結合を意味します。最適化ルーチンは、1つ以上のパーティション式のすべてのパーティション列が、等式結合条件で指定されている場合に、直接積結合を選択することができます。
静的パーティション行排除(静的行パーティション排除を参照)の場合と同様に、データベースは各パーティション式について個別に、シングルレベル パーティションにプロダクト ジョインDPEの最適化を適用します。
行パーティション排除の方法は、同じクエリー内で組み合わせることができます。例えば、静的行パーティション排除は一部のパーティション レベルで使用することができます。一方、DPEはその他のレベルで使用することができます。また、一部のレベルでは、いかなるパーティション排除も実行されない場合があります。一部のパーティション レベルでは、複数形式のパーティション排除を使用することによって、処理が簡略化されることもあります。
システムは、パーティション排除プロセスの結果を組み合わせして、どの内部パーティションにアクセスが必要であるかを判断します。結合は、問合わせ計画生成の一部として、静的パーティション排除で実施できます。
DPEは、行セットが処理される際にAMP内で実行され、その時点で問合わせ計画からの任意の静的行パーティション排除と組み合わせされます。
結合ステップを実行するとき、行パーティション化されたテーブルの適格な行パーティションまたは結合インデックスは、結合内のもう一方のリレーションから選択された行の値に基づいて動的に判断されます。行パーティション化されたテーブル内のすべての行に対するプロダクト ジョインの代わりに、データベースは、バイナリ結合のもう一方のリレーションで、単一の行パーティションと一致する行の各セットに対してのみ、プロダクト ジョインを実行します。データのデモグラフィックや使用されているパーティションの形式によっては、他の結合計画により良い見積もりコストが存在している可能性があります。このため、データベースはこのタイプの問合わせに、必ずしもこの最適化の使用を選択するわけではありません。
1つのテーブルのパーティション列と、結合内のもう一方のリレーションの列との間に等号制約がある場合、プロダクト ジョインに対するDPEが実行される可能性があります。これは、システムがテーブル全体にプロダクト ジョインを実行する代わりに、プロダクト ジョインを使用して、1つのテーブル内で行を検索し、それらの行を対応する行パーティション内の行と一致させる必要がある場合に有効です。この場合、リクエストに応じる必要がある行パーティションのみが、結合に含まれます。
DPEによる積結合では、左リレーションは右リレーションと同じパーティション式を使用して、Rowkeyで並べ替えられます。
左リレーションの行は、一度に1つの行パーティションずつキャッシュにロードされます。 このパーティションは、右の行パーティション化されたテーブルを読み取るためのパーティションとして設定されます。 右テーブルのパーティションの終端に達すると、システムは次の行パーティションで左のキャッシュを再読み込みし、プロセスが繰り返されます。
例えば、行パーティション化されたテーブルに100の行パーティションがあるが、この中で結合リクエストに応えるために必要なのは5つのみである場合、システムは残りの95の行パーティションを結合せず、その操作のリソースを95%節約します。
- プライマリ インデックス
- システム派生PARTITION列
- 行パーティション化されたテーブルのパーティション列
- 行パーティション化されたテーブルのパーティション列と同等とみなされている、その他のテーブルの列
文字パーティションの動的行パーティション排除による積結合
- この結合の見積もりコストは、他のすべての結合タイプの見積もりコストより小さくなります。
- パーティション レベルで検討される文字パーティション列を1つのみにする必要があります。
- 行パーティション化されたテーブルのセッション照合順序または照合順序がMULTINATIONALまたはCHARSET_COLLのいずれかで、考慮されているパーティション レベルのパーティション式で非定数式を含む比較関数および文字列関数が大文字小文字を区別しない場合、セッションの照合順序が行パーティション化されたテーブルの照合順序と一致する必要があります。次の関数および属性は大文字小文字を区別しません。
- LOWER関数
- SOUNDEX関数
- UPPER関数
- UPPERCASE属性
次の関数では大文字小文字が区別されます。- CHAR2HEXINT
- TRANSLATE
- TRANSLATE_CHK
- TRIM
- VARGRAPHIC
連結演算子(||)が存在する場合、大文字小文字の区別ありと区別なしの両方のプロパティを持つ式としてマークされます。
次の関数は、比較演算子、関数入力引数、およびCPPIが作成または変更されたときに有効だったセッション モードのデフォルトの大文字小文字の区別と同じルールに従います。システムはこれらのすべてを調べて大文字小文字の区別を決定します。- INDEX
- MINDEX
- POSITION
SUBSTRING関数を指定しても、大文字小文字の区別には影響しません。
- DPEとのプロダクト ジョインのための行パーティション化されたレベルを修飾するWHERE句の述部で大文字小文字が区別されない場合、そのレベルのパーティション式に含まれる非定数式のすべての比較関数および文字列関数でも大文字小文字が区別されないようにする必要があります。
条件内の非定数式を含むいずれかの比較関数または文字列関数の大文字小文字が区別されない場合、WHERE句の述部では大文字小文字が区別されないと見なされます。
文字パーティション列のすべての等価結合条件で大文字小文字が区別される場合、最適化ルーチンで特定の行パーティション化されたレベルでのDPEとの積結合を指定するために、現在のセッションの照合が行パーティション化されたテーブルの照合と一致する必要はありません。