- 動的行パーティション排除を利用すると、パーティション化されたテーブルのパーティション列セットに対する等価条件によって、パーティション化されたテーブルと別のテーブルを結合するときのパフォーマンスを向上できます。
これは、包含プロダクト ジョインでは機能しません。その場合、最適化ルーチンはIN (subquery)結合条件の実行を指定します。
- リクエストに応答する必要があるパーティションだけが、結合に含まれます。
結合ステップを実行するとき、システムは、他のテーブルからの列の値に動的に基づいて、パーティション化されたテーブルの適格なパーティションを判別します。
パーティション化されたテーブルのすべての行に対して積結合を実行する代わりに、最適化ルーチンは、他方のテーブル全体ではなく、1つのパーティションの行に対してのみ積結合を実行します。
例えばパーティション化されたテーブルにパーティションが100個あり、結合リクエストに回答するために必要なパーティションは5個だけの場合、他の95個に対しては結合が実行されず、システムはその結合操作で95%のリソースを節約できます。
- 結合列の統計は常に収集してください。
次のテーブル定義、EXPLAINリクエスト、およびEXPLAINレポートは、結合にかかわるテーブルの1つがPPIテーブルである場合に、動的行パーティション排除を利用すると結合操作がどのように効率化されるかを示す例です。
CREATE SET TABLE DB.sales ( -- Defines total day sales prodid INTEGER, -- for each product saledate DATE FORMAT 'YYYY-MM-DD', amount DECIMAL(10,2)) PRIMARY INDEX (prodid, saledate) PARTITION BY RANGE_N(saledate BETWEEN DATE '2004-01-01' AND DATE '2004-12-31' EACH INTERVAL '1' MONTH ); CREATE SET TABLE DB.fiscal_month ( -- Defines the days in yr SMALLINT NOT NULL, -- in each fiscal month. mth SMALLINT NOT NULL, -- A fiscal month may dayofmth DATE NOT NULL) -- partially span up PRIMARY INDEX (yr, mth); -- to 2 calendar months.
例えば、2004年の会計月9月は、8月30日から9月26日、または28日です。
毎日、2 AMPシステムと10製品の販売を想定しています。
以下のSELECT文のEXPLAINには、プライマリ インデックス"DB.fiscal_month.yr = 2004, DB.fiscal_month.mth = 9"(この後に行キーでパーティション化するためのSORTが続く)を経由したDB.fiscal_monthからのRETRIEVEステップが含まれます。 次に、プロダクト ジョインを使用し、動的パーティション排除で強化した結合条件("DB.sales.saledate = dayofmth")を適用して、DB.salesのすべてのパーティションに対しJOINステップを実行します。
SELECT yr, mth, SUM(amount) FROM DB.sales, DB.fiscal_month WHERE saledate = dayofmth AND yr = 2004 AND mth = 9 GROUP BY yr, mth;