検索

ジョインの特徴とさまざまなジョイン・プラン


ジョインの概念

デパートでシャツとズボンを合わせて購入する際、それぞれ数着ほど選んで試着室であれこれ組み合わせて検討すると思います。このとき、どうしたら最も効率よく比較検討できるでしょうか。ここでは、1.移動の手間と、2.比較の手間を考えてみたいと思います。

検討する対象が違う売り場にあるままでは比較できません。そのため、シャツとズボンの売り場が異なる場合は、一方を他方に移動させることになります。その際、例えば検討対象のシャツが 10枚でズボンが 3本の場合、シャツを 10枚持ってズボン売り場の試着室に行くよりは、ズボン 3本をシャツ売り場に持って行ったほうが効率はいいでしょう。また、比較の手間は条件によっていくつかパターンが異なります。例えば、サイズは分かっていてデザインが全て異なる場合は、全てのパターンについて検討する必要がありますので、先ほどのケースだと 10 × 3 の 30通りを検討することになります。あるいは、デザインは決まっていてサイズだけの問題であれば、サイズ順に並べてから順番に合わせれば比較的少ない回数で選択することができます。ただし、その場合は並び替える手間の考慮も必要です。

Teradataデータベースのジョインの概念もこれに似ています。まず、ジョインの大前提として、比較されるテーブルの行は必ず同じ AMP上に存在しなければなりません(図1)。別の試着室にあるものを比較することはできないのです。Teradataデータベースは、プライマリ・インデックス(PI)の値をキーにハッシュ値を求めて行を格納する AMP を決定するため、PIカラムの値が異なれば、行は異なる AMP に格納されます。そのため、比較する行を同一AMP に保持させるためには、PIカラム同士で結合する場合を除いて、何らかの方法でテーブルを移動させる必要があります。また、比較のパターンに関しては、結合するテーブルの状態に応じてさまざまなジョインの手法が適用されます。

テーブルの複製と再分散

比較対象の行が同一AMP 上に存在しない場合、テーブルを移動するための手段として、ジョイン対象のテーブルの複製もしくは再分散が実行されます。

複製とは、テーブルの全件イメージを全ての AMP のスプール(*1) にコピーする方法です。テーブルのサイズが小さければ問題ありませんが、大きいテーブルの全件イメージを全ての AMP にコピーすると、大量のスプール領域を消費してしまいます。

再分散とは、結合カラムでハッシュ値を計算して各AMP のスプールに格納しなおす方法です。Teradataデータベースは、ハッシュ値を基に格納先の AMP を特定します。同一値から計算されたハッシュ値は常に同じ値になるため、格納先の AMP も同じになります。複製よりも各AMP に配布されるデータ量は少ないためスプールの消費量は少ないですが、ハッシュ値を求め直すオーバーヘッドがあります。

複製も再分散も比較対象の行を同一AMP に展開するという目的を達成するために実行されますが、どちらの方法が選択されるかは、オプティマイザーがテーブルのサイズや様々な条件を考慮して判断します(図2)。

結合の種類

Teradataデータベースの代表的な結合のタイプには以下のものがあります(図3)。

1. プロダクト・ジョイン プロダクト・ジョインは、結合条件が等号で結ばれていないときや OR の指定があるときなどに使用される結合方法です。オプティマイザーは小さい方のテーブルを特定し、それを全AMP のスプールに複製します。そして、スプール上の小さいテーブルと大きい実テーブルの全ての行が照合されます。データを並び替える必要はありませんが、テーブルがどちらも大きいと、テーブルの複製と照合でシステムのリソースを大量に消費しますので、結合条件における不等号の使用や OR の指定には十分注意してください(*2)。

2. マージ・ジョイン マージ・ジョインは、結合条件が等号で結ばれているときに使用される一般的な結合方法であり、結合カラムを行ハッシュ順に並べ替えてから結合列の行ハッシュ値が一致する行を結合します(*3)。テーブルの一方が小さい場合はそれを全AMP に複製して行ハッシュ順にソートして比較されます。また、結合カラムの条件によっては、一方もしくは両方のテーブルを結合カラムで各AMP のスプールに行ハッシュ順に再分散させて結合します。 マージ・ジョインは比較操作が少ないため、通常はプロダクト・ジョインよりも効率はいいです。

3. ハッシュ・ジョイン ハッシュ・ジョインは、マージ・ジョインの一種ですが、結合条件が等号で結ばれており、しかも各AMP の一方もしくは両方のテーブルが AMPメモリー内に収まる場合のみ行われます。小さい方のテーブルは結合カラムで行ハッシュ順にソートされ全AMP に複製されます。大きいテーブルのソートや複製、そして再分散は不要です。

4. ネステッド・ジョイン ネステッド・ジョインは、一方のテーブルのユニーク・インデックス(UPI または USI)が等号指定されており、他方のテーブルのインデックス・カラムと結合しているときに使用される特殊なジョインです。ネステッド・ジョインは全AMP を使わない可能性のある唯一のジョインです。

まとめ

テーブルをジョインする際の原則やさまざまな結合手法について説明してきました。どの手法を用いるかはオプティマイザーの判断であり、ユーザーは指定することはできませんが、これらの特性を理解しておくことでより効率的なクエリーを作成することが可能になります。また、オプティマイザーは利用可能なインデックスや統計情報を基に結合方法を確定します。そのため、統計情報が古くて実態とかけ離れていると、非効率な結合方法を選択してしまう可能性がありますので、常に正しい統計情報を維持することを心がけてください。

  • *1: スプールは、クエリーの中間結果を格納するために Teradataデータベースが使用する、ユーザーまたはデータベースに割り当てられている一時的な作業領域です。

  • *2: プロダクト・ジョインの処理で、ユーザーのスプール領域を超えた場合は、そのトランザクションはアボート(中止)されます。

  • *3: 結合カラムがどちらも PI である場合は、既に行ハッシュ順に並んでいるため、再分散やソートの必要はありません。


eventbanner.png