17.00 - 17.05 - 結合戦略と結合方式 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLリクエストおよびトランザクション処理

Product
Advanced SQL Engine
Teradata Database
Release Number
17.00
17.05
Published
2020年6月
Content Type
プログラミング リファレンス
ユーザー ガイド
Publication ID
B035-1142-170K-JPN
Language
日本語 (日本)

最適化ルーチンには、結合ジオグラフィや結合順序などの要素に基づくものも含め、テーブルを結合するための戦略がいくつか用意されています。最適化ルーチンは、どの結合操作でも十分に最適化する、選択可能な多くの結合方式、またはモードも備えています。Teradata最適化ルーチンで使用可能な結合方式の結合セクションは、以下の節で説明します。結合方式の例として、プロダクト ジョイン、マージ結合、およびハッシュ結合が挙げられます。

特定の結合方式で説明されている処理(例えば、スプール データの複製や再分散)が、すべての結合に適用されるとは限りません。

結合操作の最適化に役立つ指針

以下の処理は、SQL問合わせを最適化するための主な手順です。
  • すべての通常結合列について、統計情報を定期的に収集してください。最適化ルーチンが問合わせに対して最良の結合計画を常に選択する場合は、正確な表の統計情報が必須です。

    COLLECT STATISTICS文の最適化ルーチン形式の詳細については、<Teradata Vantage™ - SQLデータ定義言語-構文規則および例、B035-1144>を参照してください。

  • ある特定の結合で実行される正確な処理計画を取得するには、結合式を含むクエリーに対して、常にEXPLAINリクエスト修飾子を実行依頼してください。上記の方法を用いて問合せを再実行することで、リソースの利用をより最適化することができます。

    EXPLAINリクエスト修飾子の詳細については、<Teradata Vantage™ - SQLデータ操作言語、B035-1146>を参照してください。

もっとも一般的に使用される結合アルゴリズムのサマリー

もっとも一般的に使用される結合アルゴリズムの特性を、以下のテーブルに要約します。

結合方式 重要な特性
  • WHERE句の不等条件に対して、最適化ルーチンにより常に選択される。
  • 要求される比較操作の回数が多いため、コストが高い。
  • マージ
  • ハッシュ
  • プライマリ[AMP]インデックスの照合が終了すると、データの再分散は必要ない。
  • パフォーマンスが高い場合が多いので、可能な限りハッシュ結合を使用する。それらは等結合にのみ使用可能です。
入れ子
  • 通常はすべてのAMPを必要としない唯一の結合式。
  • OLTPアプリケーション向けの結合式。

等価結合条件に基づいてひずみのあるテーブルを結合するための戦略

結合内のテーブルの一方または両方にひずみのある値が含まれていると、結合操作の性能が低下することがよくあります。特定の値のひずみは、複数のAMP内のそのような値を含む行数のばらつきを意味します。このばらつきが大きい、つまり、そのような値を持つ行数が非常に多いAMPと非常に少ないAMPが混在している場合は、値にひずみがあると表現され、基本テーブルはそれらの値に対してひずみがあると表現されます。

例えば、product.product_id = sales.product_idという条件に基づいて結合されたproductsalesという2つのテーブルがあり、列sales.product_idが値1に対してひずみがあるとします。

従来の結合戦略は後述するようなさまざまな地理学的方法を追求します。そこでは、個々のテーブルの相対的サイズが、最適な戦略を選択するうえで重要なロールを果たします。例えば、2次計画と3次計画のどちらかまたはその両方で大きなテーブルが重複している場合は、リストからどの計画を選択してもパフォーマンスが低下する可能性があります。
  • productに対してproduct.product_idを再配置し、salesに対してsales.product_idを再配置します。
  • productを複製して、論理的/直接的にsalesにアクセスします。
  • 論理的/直接的にproductにアクセスして、salesを複製します。
部分再配置部分重複(PRPD)結合戦略は、例えば、salesproductの間の結合を2つの別々の結合として作成することによって、結合パフォーマンスに対するひずみの影響を最小限に抑えることができます。
  • 最初の結合の場合、PRPDは、各AMP上でsales.product_idがひずみのある値1になっている行をローカルに維持し、product.product_idのひずみのある値と一致するsales.product_idからの行をすべてのAMPに複製してから、それらの行だけを結合します。
  • 2回目の結合の場合、PRPDは、最適化ルーチンが最適と判断した結合方法を使用して、salesテーブルからのひずみのない行とproductテーブルからの残りの行を組み合わせします。

データベースは、これらの2つの結合の結果を最終的な結合の結果として組み合わせます。

1つのソース内の行を複数の副部品に分けるプロセスを分割と言います。PRPD結合戦略を使用して、データベースは、salesテーブルとproductテーブルの両方を2つの通常結合に関与する2つのリレーションに分割します。ひずみのある値を含む2つのテーブルの副部品の場合は、最適化ルーチンがさまざまな結合計画のコストに基づいて最適な結合計画を選択するため、その計画に合わせてジオグラフィが設定されます。

前述のケースは、1つのテーブルの1つの列に1つのひずみのある値が存在する場合に見られるPRPDの例にすぎません。最適化ルーチンは、テーブルの一方または両方にスキューのある値とそれらを含む結合列が複数存在する場合もPRPDを使用できます。一連の結合条件が基本テーブル列の式に含まれており、その式に基づいて統計が収集された場合も、最適化ルーチンはPRPDを使用してひずみのあるテーブルを結合できます。

前述の例では、最適化ルーチンが、売上げ内でひずみのある行のローカル ジオグラフィを1つ選択し、製品内でスキューのある値を持つ行の重複ジオグラフィを1つ選択します。これらのジオグラフィはPRPD内で固定されません。

PRPDには、ひずみのある値のリストを特定するための、正確な統計などの他の結合操作と同じデモグラフィック サポートが必要です。PRPDは、最適化ルーチンが必要と判断した場合に、ひずみ検出ロジックを使用して既存の統計を更新します。また、最適化ルーチンは、他の結合方法よりコストがかからない場合にのみPRPDを使用して結合計画を選択します。結合する両方のリレーションが同じ値に対して偏っている場合は、どのリレーションがひずみのあるリレーションとして選択されるかがひずみのある値を含む行数と両方のリレーションの行サイズによって決まります。最適化ルーチンは、これらの要素に基づいて、よりコストの高いリレーションをひずみのあるリレーションとして選択します。

最適化ルーチンが結合にPRPDを使用するかどうかを判断するときに直面する主な課題は、ひずみのある値とその頻度を特定することです。これは、単一テーブル条件と過去の結合(もしあれば)によって、一部のひずみのある値が除去され、残存するひずみのある値の頻度が変化する可能性があるためです。最適化ルーチンが、常に、PRPD計画に最適なひずみのある値情報を持っているとは限りません。

PRPDは、内部パラメータ設定に基づいて、2つのモードのどちらかで動作するように設計されています。

モード 最適化ルーチンがPRPD計画を考慮するタイミング
標準 残存するひずみのある値とその頻度を一定の精度で決定できる場合のみ。

これがデフォルト設定です。

積極 残存するひずみのある値に関する正確な情報が存在しない場合でも考慮する。

ひずみのある値はヒューリスティックに基づいて導出されます。

最適化ルーチンが結合操作を使用してPRPD計画を試すことが可能なタイミングを特定するための例を以下に示します。

例として以下の3つのテーブルを想定します。
  • t1(x1, y1, z1)、(x1)に対して定義されたプライマリ インデックス
  • t2(x2, y2, z2)、(x2)に対して定義されたプライマリ インデックス
  • t3(x3, y3, z3)、(x3)に対して定義されたプライマリ インデックス
以下の例で、リレーションがPRPDに適しているというときは、以下の項目が正しいことを意味します。
  • 統計がハッシュされた結合列セットに対して収集される。
  • 結合列セットのデモグラフィックが内部パラメータ設定によって決定された一連の条件を満たしている。

デフォルトで、標準PRPDモードが使用されます。例が積極モードにしか適用されない場合は、そのように明記されます。

例: ひずみのあるテーブルが複数存在する場合のPRPD

この例では、t1t2のどちらかがPRPDに適している場合に、最適化ルーチンがt1またはt2をひずみのあるリレーションと見なすことによってPRPD計画を試します。この場合は、2つの部分結合が存在します。

t1t2の両方のテーブルにひずみがある場合は、最適化ルーチンが3つの結合を使用してPRPD計画を試します。

SELECT *
FROM t1, t2
WHERE t1.y1 = t2.y2;

例: 抽出された統計で残存するひずみのある値を特定できる場合のPRPD

この例では、抽出された統計ロジックで、ヒストグラムから残存するひずみのある値を一定の精度で見つけることができるため、統計がt1に対して収集された場合はy1がPRPDに適しています。

SELECT *
FROM t1,t2
WHERE t1.y1 = t2.y2
AND   t1.y1 > 5;

例: ひずみのある値の単一列統計と複数列統計が混在する場合のPRPD

この例では、抽出された統計ロジックで、単一テーブル条件が適用された後のt1.y1の残存値の範囲を見つけることができるため、統計が(t1.y1)と(t1.z1, t1.y1)に対して収集された場合はt1がPRPDに適しています。

(t1.z1, t1.y1)に関する複数列統計が収集されなかった場合は、最適化ルーチンが単一テーブル条件を適用後にt1.y1列で残存するひずみのある値を見つけることができないため、t1は標準モードではPRPDに適していません。このケースでは、PRPDの内部パラメータが積極モード用に設定されている場合にのみ、最適化ルーチンがPRPDを考慮します。

SELECT *
FROM t1,t2
WHERE t1.y1 = t2.y2
AND   t1.z1 > 5;

最適化ルーチンで、単一テーブル条件が存在しても一定の精度で結合列上の残存するひずみのある値を見つけることができる他のシナリオが存在します。例えば、テーブルをカバーするスパース結合インデックスが存在し、統計が結合インデックス内の結合列に関して収集された場合です。この例では、以下の定義を含む結合インデックスが存在し、統計がj1.y1に関して収集された場合に、t1はPRPDに適格となることができます。

CREATE JOIN INDEX j1 AS
  SELECT *
  FROM t1
  WHERE z1 > 5;

例: ひずみのある式統計のPRPD

最適化ルーチンは、式(t1)に関する統計が入手可能な場合にのみ、PRPDに対してt1.y1 + t1.z1を評価します。最適化ルーチンが(t1.y1 + t1.z1)式統計に基づいてt1がPRPDに適していると判断した場合は、例: ひずみのあるテーブルが複数存在する場合のPRPDと同様のPRPD計画を試します。

SELECT *
FROM t1,t2
WHERE t1.y1 + t1.z1 = t2.y2;

例: ひずみのある単一列統計のPRPD

t1.y1にひずみがあり、統計がt1.y1に関して収集され、最初の結合(R4)がt1テーブルとt3テーブルの間に存在するとします。最初の結合後は、最適化ルーチンが結合条件y1の適用後に残存するt1.x1 = t3.x3からのひずみのある値を特定できなくなるため、R4 X R2結合の場合は、R4がPRPDに適格ではありません。

このケースでは、PRPDの内部パラメータが積極モード用に設定されている場合にのみ、最適化ルーチンがPRPDを考慮します。

SELECT *
FROM t1,t2, t3
WHERE t1.y1 = t2.y2
AND   t1.x1 = t3.x3;

例: 一部の値に対してひずみのある複数列セットのPRPD

(t1.y1, t1.z1)と(t2.y2, t2.z2)が一部の値に対してひずみがあり、それらの列セットに関する複数列統計が収集されているとします。

このリクエストを処理するために、最適化ルーチンは、通常、(t1.y1, t1.z1)上の重複を排除する事前結合ソートを使用した包含結合を選択します。(t1.y1, t1.z1)上にひずみが存在する場合は、事前結合ソートによって重複が排除されると同時に、ひずみも除去されます。そのため、最適化ルーチンは、t1をひずみのあるテーブルと見なして、PRPD計画を評価しません。ただし、(t2.y2, t2.z2)上にひずみが存在する場合は、最適化ルーチンがPRPD計画を考慮します。

SELECT *
FROM t2
WHERE t2.y2 IN (SELECT t1.y1
                FROM t1
                WHERE t2.z2 = t1.z1);

結合に関する詳細情報

プロダクト ジョインの詳細については、プロダクト ジョインを参照してください。

ハッシュ結合の詳細については、ハッシュ結合を参照してください。

行ID結合の詳細については、行ID結合を参照してください。

列パーティション化されたテーブルおよび結合インデックスの詳細については、<Teradata Vantage™ - SQLデータ定義言語 - 詳細トピック、B035-1184>の「CREATE TABLE」および「CREATE JOIN INDEX」と、<Teradata Vantage™ - データベースの設計、B035-1094>のプライマリ インデックス、ハッシュ インデックス、結合インデックスに関する情報を参照してください。