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