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
日本語 (日本)

シングル ウィンドウ マージ結合について

シングル ウィンドウ マージ結合は、スライディング ウィンドウ マージ結合(スライディング ウィンドウ マージ結合を参照)に非常に似ています。ただし、結合内の各テーブルに対して静的または遅延行パーティション排除が適用された後の、配置済みパーティションの数は、一度に全パーティションを処理できる程度に少なくなるという点が異なります。これは、PPIテーブルとPPIテーブルの結合、PPIテーブルとパーティション化されていないプライマリ インデックス付きテーブルの結合、パーティション化されていないプライマリ インデックス付きのテーブルとPPIテーブルの結合、PPIテーブルとスプールの結合、またはスプールとPPIテーブルの結合のいずれかになります。

2つのリレーションは、プライマリ インデックスで等式条件で結合する必要があります。関係する行パーティションの数には制限が必要です。関係する行パーティションの見積もり数は、静的パーティション排除後の、配置済み行パーティションの見積もり数に基づいています。単一セットとして処理される組み合わせされたパーティションの最大数は、単一レベルのパーティション化の場合と同じ方法で決定されます。

この計算は、DBS制御フィールドPPICacheThrPの設定値に基づきます。

最適化ルーチンは、セットが十分に小さいかどうかを見積もります。見積もりが実際のデータと異なる場合は、スライディング ウィンドウ マージ結合が使用される場合と使用されない場合があります。例えば、見積もりでシングル ウィンドウ マージ結合が最適な計画であると示されていても、静的または遅延パーティション排除が適用された後に、配置済み行パーティションが多数存在する場合は、スライディング ウィンドウ マージ結合が実行される可能性があります。最適化ルーチンは、シングル ウィンドウ マージ結合のコストが、他の結合方式のコストを上回ると見積もることがあります。この場合は、他の結合方式が使用されます。

シングル ウィンドウ マージ結合では、一方のリレーションが列パーティション化されている場合、最初に列パーティション化されたリレーションをスプールして、その後でソートする必要があります。

シングル ウィンドウ マージ結合は、非文字パーティション化されたテーブルと、文字パーティション化されたテーブルに使用できます。

次の例では、システムは2つのテーブルをプライマリ インデックス上で結合します。WHERE句条件は、ordersのレベル1に値する2つのパーティションおよびレベル2に値する3つのパーティションを除くすべてのパーティションを排除します。また、WHERE句条件は、lineitemのレベル1に値する1つのパーティションおよびレベル2に値する7つのパーティションを除くすべてのパーティションを排除します。これらの条件を適用した後、ordersの結合式の6つのパーティションを、lineitemの組み合わせパーティション式の7つのパーティションに結合して、合計で13のパーティションを作成する必要があります。

このとき、最適化ルーチンが直接マージ結合を最もコスト効率のよい方法であると見積もる場合、それを使用して2つのテーブルを結合することができます。2つのセットのパーティションを結合する場合、直接マージ結合操作では、各配置済みパーティションのメモリ常駐データ ブロックを維持することによって、行セットがハッシュ順になっているかのように論理的に処理されます。

この問合わせ例で結合される2つのテーブルについての定義DDL文テキストは、次のようになります。

CREATE TABLE orders (
  o_orderkey      INTEGER NOT NULL,
  o_custkey       INTEGER,
  o_orderstatus   CHARACTER(1) CASESPECIFIC,
  o_totalprice    DECIMAL(13,2) NOT NULL,
  o_orderdate     DATE FORMAT 'yyyy-mm-dd' NOT NULL,
  o_orderpriority CHARACTER(21),
  o_clerk         CHARACTER(16),
  o_shippriority  INTEGER,
  o_comment       VARCHAR(79))
PRIMARY INDEX (o_orderkey)
PARTITION BY (
RANGE_N(o_custkey   BETWEEN 0
                    AND 49999
                    EACH  100),
RANGE_N(o_orderdate BETWEEN DATE '2000-01-01'
                    AND DATE '2006-12-31'
                    EACH INTERVAL '1' MONTH))
UNIQUE INDEX (o_orderkey);
CREATE TABLE lineitem (
  l_orderkey      INTEGER NOT NULL,
  l_partkey       INTEGER NOT NULL,
  l_suppkey       INTEGER,
  l_linenumber    INTEGER,
  l_quantity      INTEGER NOT NULL,
  l_extendedprice DECIMAL(13,2) NOT NULL,
  l_discount      DECIMAL(13,2),
  l_tax           DECIMAL(13,2),
  l_returnflag    CHARACTER(1),
  l_linestatus    CHARACTER(1),
  l_shipdate      DATE FORMAT 'yyyy-mm-dd',
  l_commitdate    DATE FORMAT 'yyyy-mm-dd',
  l_receiptdate   DATE FORMAT 'yyyy-mm-dd',
  l_shipinstruct  VARCHAR(25),
  l_shipmode      VARCHAR(10),
  l_comment       VARCHAR(44))
PRIMARY INDEX (l_orderkey)
PARTITION BY (
RANGE_N(l_suppkey  BETWEEN 0
                   AND  4999
                   EACH   10),
RANGE_N(l_shipdate BETWEEN DATE '2000-01-01'
                   AND     DATE '2006-12-31'
                   EACH INTERVAL '1' MONTH));

最適化ルーチンは、次のクエリーについての結合計画を作成する際に、ordersテーブルとlineitemテーブルの結合にシングル ウィンドウ マージ結合を適用します。

SELECT *
FROM orders INNER JOIN lineitem
WHERE o_orderkey = l_orderkey
  AND o_orderdate BETWEEN DATE '2005-04-01'
                  AND     DATE '2005-06-30'
  AND o_custkey   IN (618, 973)
  AND l_shipdate  BETWEEN DATE '2005-04-01'
                  AND     DATE '2005-10-31'
  AND l_suppkey = 4131;