17.00 - 17.05 - 直接行パーティションPIマージ結合 - 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
日本語 (日本)

直接行パーティション化された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;