直接行パーティション化されたPIマージ結合について
直接マージ結合という用語は、該当するテーブルまたは結合インデックスが、マージ結合に備えてスプールされない代わりに、直接実行される結合方式を意味します。最適化ルーチンは、少なくともプライマリ インデックスのすべての列が等式結合の条件に指定されている場合には、直接マージ結合を選択することがあります。
直接行パーティション化されたPIマージ結合の条件を満たすには、2つのリレーションのすべてのプライマリ インデックス列で、等式条件が存在しなければなりません。これは、文字および非文字行パーティションPIに等しく適用されます。この最適化にはいくつかの形式があります。最適化ルーチンによって選択される特別な形式は、次のような要因によって異なります。
- 問合わせ内の追加条件
- 行パーティションの総数
- 配置済み行パーティションの数
次の例では、最適化ルーチンはmarketsとmarket_penetrationの直接マージ結合を実行できます(両テーブルをスプールに再分散してプライマリ インデックスのハッシュ順にスプールをソートし、行ハッシュ マージ結合を実行する代わりに)。
この例には、次のテーブル定義を使用します。
CREATE TABLE markets ( productid INTEGER NOT NULL, region BYTEINT NOT NULL, activity_date DATE FORMAT 'yyyy-mm-dd' NOT NULL, revenue_code BYTEINT NOT NULL, business_sector BYTEINT NOT NULL, note VARCHAR(256)) PRIMARY INDEX (productid, region) PARTITION BY ( RANGE_N(region BETWEEN 1 AND 9 EACH 3), RANGE_N(business_sector BETWEEN 0 AND 49 EACH 10), RANGE_N(revenue_code BETWEEN 1 AND 34 EACH 2), RANGE_N(activity_date BETWEEN DATE '1986-01-01' AND DATE '2007-05-31' EACH INTERVAL '1' MONTH)); CREATE TABLE market_penetration ( productid INTEGER NOT NULL, region BYTEINT NOT NULL, activity_date DATE FORMAT 'yyyy-mm-dd' NOT NULL, revenue_code BYTEINT NOT NULL, business_sector BYTEINT NOT NULL, saturation FLOAT) PRIMARY INDEX (productid, region) PARTITION BY ( RANGE_N(region BETWEEN 1 AND 9 EACH 3), RANGE_N(business_sector BETWEEN 0 AND 49 EACH 10), RANGE_N(revenue_code BETWEEN 1 AND 34 EACH 2), RANGE_N(activity_date BETWEEN DATE '1986-01-01' AND DATE '2007-05-31' EACH INTERVAL '1' MONTH));
この例のリクエストでは、marketsとmarket_penetrationを結合します。指定されている条件により、最適化ルーチンは直接の行パーティションPIから行パーティションPIマージ結合を選択して、リレーションを結合することができます。
SELECT a.*, b.saturation FROM markets AS a INNER JOIN market_penetration AS b WHERE a.productid = b.productid AND a.region = b.region AND a.business_sector = b.business_sector AND a.revenue_code = b.revenue_code AND a.activity_code = b.activity_code;