PolarDB for PostgreSQL (Oracle互換) は、パーティションプルーニングをサポートしています。 オプティマイザは、パーティションキーに基づいてfromおよびWHERE句からスキャンする必要があるパーティションを自動的に抽出します。 これにより、テーブル全体のスキャンが防止され、スキャンするデータブロックの数が減少します。 これにより、クエリのパフォーマンスが向上します。
パーティションプルーニングのメカニズムは、次の2つのプルーニング手法を使用します。
制約排除
高速排除
制約排除
constraint_exclusionパラメーターは、制約の除外を制御するために使用されます。 有効な値はon、off、partitionです。 デフォルト値はpartitionです。 制約除外を有効にするには、constraint_exclusionパラメーターをpartitionまたはonに設定します。 制約除外を無効にするには、constraint_exclusionパラメーターをoffに設定します。
制約除外が有効になっている場合、サーバーは各パーティションに定義されている制約をチェックして、パーティションがクエリを満たすことができるかどうかを判断します。
WHERE句を含まないSELECTステートメントを実行する場合、クエリプランナーはテーブル全体を検索する実行プランを推奨します。
WHERE句を含むSELECTステートメントを実行すると、クエリプランナはレコードを格納するパーティションを決定し、そのパーティションにクエリフラグメントを送信します。 これにより、レコードを含めることができないパーティションが実行プランから除外されます。
パーティションテーブルを使用しない場合は、パフォーマンスを向上させるために制約除外を無効にすることを推奨します。
高速排除
高速プルーニング手法では、ステートメントにWHERE句が含まれ、WHERE句の修飾子が特定の形式と一致する場合にのみ、クエリステートメントを最適化できます。 この制限は、制約除外技術の制限と同じです。
polar_comp_enable_pruningパラメーターは、高速プルーニングを制御するために使用されます。 有効な値はオンとオフです。 デフォルト値はonです。 polar_comp_enable_pruningパラメーターがonに設定されている場合、特定のクエリを高速プルーニングするために高速プルーニングが有効になります。 polar_comp_enable_pruningパラメーターがoffに設定されている場合、高速プルーニングは無効になります。
高速プルーニングでは、サブパーティションテーブルのクエリや、複数の列でパーティション分割されたレンジパーティションテーブルのクエリを最適化できません。
次の部分では、高速プルーニングの使用方法について説明します。
リストパーティションテーブルに対するクエリの場合、PolarDB For PostgreSQL (Oracle互換) は、WHERE句を含むクエリを高速にプルーニングできます。 WHERE句で使用できる演算子は、等号 (=) 、IS NULL、およびIS NOT NULLです。
以下にコードの例を示します。
リスト分割テーブルを作成します。
CREATE TABLE sales_hist(..., country text, ...) PARTITION BY LIST(country) ( PARTITION americas VALUES('US', 'CA', 'MX'), PARTITION europe VALUES('BE', 'NL', 'FR'), PARTITION asia VALUES('JP', 'PK', 'CN'), PARTITION others VALUES(DEFAULT) )
高速プルーニングを使用して、次のWHERE句のそれぞれを満たすパーティションをlist-partitionedテーブルから抽出します。
WHERE country = 'US' WHERE country IS NULL;
最初のWHERE句が使用される場合、高速プルーニングは、europeパーティション、asiaパーティション、およびその他のパーティションを除外します。 これは、これらのパーティションが
WHERE country = 'US'
を満たさないためです。2番目のWHERE句が使用されている場合、高速プルーニングは、americasパーティション、europeパーティション、およびasiaパーティションを除外します。 これは、これらのパーティションが
WHERE country is NULL
を満たさないためです。
範囲分割テーブルの場合、PolarDB For PostgreSQL (Oracle互換) は、WHERE句を含むクエリを高速にプルーニングできます。 WHERE句で使用できる演算子は、等号 (=) 、より大きい (>) 記号、より大きいまたは等しい (>=) 記号、より小さい (<) 記号、より小さいまたは等しい (<=) 記号、IS NULL、およびIS NOT NULLです。 WHERE句には、ANDまたはBETWEEN演算子を含むより複雑な式を含めることもできます。 次のWHERE句では、AND演算子とBETWEEN演算子を使用して複雑な式を形成します。
WHERE size > 100 AND size <= 200 WHERE size BETWEEN 100 AND 200
説明ORまたはIN演算子を含む式に基づいて高速プルーニングを実行することはできません。
以下にコードの例を示します。
範囲分割テーブルを作成します。
CREATE TABLE boxes(id int, size int, color text) PARTITION BY RANGE(size) ( PARTITION small VALUES LESS THAN(100), PARTITION medium VALUES LESS THAN(200), PARTITION large VALUES LESS THAN(300) )
高速プルーニングを使用して、範囲パーティション分割テーブルから次のWHERE句のそれぞれを満たすパーティションを抽出します。
WHERE size > 100-- Scans the medium partition and the large partition WHERE size >= 100-- Scans the medium partition and the large partition WHERE size =100-- Scans the medium partition WHERE size <= 100-- Scans the small partition and the medium partition WHERE size < 100-- Scans the small partition WHERE size > 100 AND size < 199-- Scans the medium partition WHERE size BETWEEN 100 AND 199-- Scans the medium partition WHERE color = 'red' AND size = 100 -- Scans the medium partition WHERE color = 'red' AND (size > 100 AND size < 199) -- Scans the medium partition
をスキャンします