このトピックでは、パーティションプルーニングの使用例を示します。
SELECT
EXPLAINステートメントは、ステートメントの実行計画を表示するために使用されます。 EXPLAINステートメントを実行して、パーティションがクエリの実行プランからプルーニングされているかどうかを確認できます。
- リスト分割テーブルを作成します。
テーブルの販売を作成する ( dept_no number, part_no varchar2, country varchar2(20), date date, 金額番号 ) リストによるパーティー (国) ( PARTITION europe VALUES('FRANCE', 'ITALY'), PARTITION asia VALUES('INDIA', 'PAKISTAN'), PARTITIONアメリカスバリュー (「米国」、「カナダ」) );
EXPLAIN
ステートメントを含む制約付きクエリを実行します。EXPLAIN (コストオフ) SELECT * FROM sales WHERE country = 'INDIA;
次の返された実行計画は、サーバーが国列の値がINDIAである行を格納するsales_asiaパーティションのみをスキャンする予定であることを示しています。postgres=# EXPLAIN (COSTS OFF) SELECT * FROM sales WHERE country = 'INDIA; クエリ計画 --------------------------------------------------- Append -> 販売のSeqスキャン Filter: ((country)::text = 'INDIA'::text) -> Seq Scan on sales_asia フィルター :( (国)::text = 'INDIA'::text) (5行)
- 次のステートメントを実行して、パーティション以外のキー列の値に基づいて特定のクエリ条件に一致するレコードをクエリできます。
EXPLAIN (COSTS OFF) SELECT * FROM sales WHERE dept_no = '30';
次の返された実行プランは、サーバーがすべてのパーティションをクエリし、クエリを満たす行を見つけることを計画していることを示しています。postgres=# EXPLAIN (COSTS OFF) SELECT * FROM sales WHERE dept_no = '30'; クエリ計画 ----------------------------------------- Append -> 販売のSeqスキャン フィルター: (dept_no = 30:: 数値) -> Seq Scan on sales_europe フィルター: (dept_no = 30:: 数値) -> Seq Scan on sales_asia フィルター: (dept_no = 30:: 数値) -> Seq Scan on sales_americas フィルター: (dept_no = 30:: 数値) (9行)
- 制約除外は、サブパーティションテーブルのクエリにも使用できます。 サブパーティションテーブルを作成する方法の例を次に示します。
create table sales ( dept_no number, part_no varchar2, country varchar2(20), date date, 金額番号 ) リストによるサブパート (国) ( パーティー「2011」の値は未満 ('01-JAN-2012 ') ( SUBPARTITION europe_2011 VALUES ('ITALY', 'FRANCE'), SUBPARTITION asia_2011 VALUES ('PAKISTAN', 'INDIA'), SUBPARTITION americas_2011 VALUES ('US', 'CANADA') ), PARTITION "2012" VALUES LESS THAN('01-JAN-2013') ( SUBPARTITION europe_2012 VALUES ('ITALY', 'FRANCE'), SUBPARTITION asia_2012 VALUES ('PAKISTAN', 'INDIA'), SUBPARTITION americas_2012 VALUES ('US', 'CANADA') ), パーティー「2013」の値は未満 ('01-JAN-2014 ') ( SUBPARTITION europe_2013 VALUES ('ITALY', 'FRANCE'), SUBPARTITION asia_2013 VALUES ('PAKISTAN', 'INDIA'), SUBPARTITION americas_2013 VALUES ('US', 'CANADA') ) );
テーブルをクエリすると、クエリプランナーは、検索パスから期待される結果セットを含まないパーティションまたはサブパーティションを削除します。postgres=# EXPLAIN (コストオフ) SELECT * から販売国='US' AND date = 'Dec 12, 2012 '; クエリ計画 ----------------------------------------------------------------------------- Append -> 販売のSeqスキャン Filter: (((country)::text = 'US'::text) AND (date = '12-DEC-12 00:00:00'::timestamp without time zone)) -> sales_2012のSeqスキャン Filter: (((country)::text = 'US'::text) AND (date = '12-DEC-12 00:00:00'::timestamp without time zone)) -> Seq Scan on sales_americas_2012 フィルター :( ((country)::text = 'US'::text) AND (date = '12-DEC-12 00:00:00 ':: タイムスタンプ、タイムゾーンなし)) (7行)
更新と削除
パーティション分割テーブルを更新または削除して、実行時にパーティションを剪定するときにEXPLAINステートメントを実行できます。
create table t1_hash (id int , value int) partition by hash (id) partitions 4;
- 次のコマンドを実行してテーブルを更新します。
postgres=# explain update t1_hash set value = value + 1ここでid = least(1,2); クエリ計画 ------------------------------------------------------------------------- t1_hashの更新 (コスト=0.00 .. 92.18行=24幅=14) t1_hash_p1の更新 t1_hash_p2 t1_hashの更新 -> 追加 (コスト=0.00 .. 92.18行=24幅=14) 削除されたサブプラン: 1 -> t1_hash_p1のSeqスキャン (コスト=0.00 .. 46.03行=12幅=14) フィルター: (id = LEAST(1, 2)) (7行)
- 次のコマンドを実行して、テーブルを削除します。
postgres=# explain delete from t1_hash where id = least(1,2); クエリ計画 ------------------------------------------------------------------------- t1_hashで削除 (コスト=0.00 .. 92.12行=24幅=10) t1_hash_p1で削除 t1_hash_p2 t1_hashの削除 -> 追加 (コスト=0.00 .. 92.12行=24幅=10) 削除されたサブプラン: 1 -> t1_hash_p1のSeqスキャン (コスト=0.00 .. 46.00行=12幅=10) フィルター: (id = LEAST(1, 2)) (7行)