[pgsql-jp: 40853] パーティションプルーニングの説明文
YOSHIDA Toshikazu
yoshida.toshikazu @ nttcom.co.jp
2011年 7月 6日 (水) 09:29:05 JST
吉田です。お世話になっております。
http://www.postgresql.jp/document/current/html/ddl-partitioning.html
5.9.2章に
「このテーブルはデータを格納しません。 このテーブルにはすべてのパーティションに対して適用されるつも
りでなければ検査制約は定義しないでください。 同様にインデックスや一意制約を定義することも意味があり
ません。」
と記述されていますが、
性能の観点から、親表にも索引が必要なのでは?と思っております。
以下、統計情報
■子表のみに適切な索引がある場合
tpcc=> explain analyze SELECT ol_i_id, ol_supply_w_id, ol_quantity, ol_amount, ol_delivery_d FROM
order_line WHERE ol_w_id = 2 AND ol_d_id = 2 AND ol_o_id = 2;
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------
Result (cost=0.00..50086.52 rows=23 width=36) (actual time=43.831..313.233 rows=14 loops=1)
-> Append (cost=0.00..50086.52 rows=23 width=36) (actual time=43.829..313.226 rows=14 loops=1)
-> Seq Scan on order_line (cost=0.00..50074.14 rows=13 width=36) (actual
time=43.828..313.176 rows=7 loops=1)
Filter: ((ol_w_id = 2) AND (ol_d_id = 2) AND (ol_o_id = 2))
-> Index Scan using order_line_2_pkey on order_line_2 order_line (cost=0.00..12.38
rows=10 width=36) (actual time=0.037..0.042 rows=7 loops=1)
Index Cond: ((ol_w_id = 2) AND (ol_d_id = 2) AND (ol_o_id = 2))
Total runtime: 313.289 ms
■親表に索引を作成して同じクエリを実行
tpcc=> ALTER TABLE order_line add CONSTRAINT order_line_pkey PRIMARY KEY(ol_w_id, ol_d_id, ol_o_id,
ol_number);
NOTICE: ALTER TABLE / ADD PRIMARY KEYはテーブル"order_line"に暗黙的なインデックス"order_line_pkey"
を作成します
ALTER TABLE
tpcc=> ANALYZE ;
ANALYZE
tpcc=> explain analyze SELECT ol_i_id, ol_supply_w_id, ol_quantity, ol_amount, ol_delivery_d FROM
order_line WHERE ol_w_id = 2 AND ol_d_id = 2 AND ol_o_id = 2;
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------
Result (cost=0.00..40.41 rows=23 width=36) (actual time=0.090..0.127 rows=14 loops=1)
-> Append (cost=0.00..40.41 rows=23 width=36) (actual time=0.089..0.118 rows=14 loops=1)
-> Index Scan using order_line_pkey on order_line (cost=0.00..28.03 rows=13 width=36)
(actual time=0.088..0.094 rows=7 loops=1)
Index Cond: ((ol_w_id = 2) AND (ol_d_id = 2) AND (ol_o_id = 2))
-> Index Scan using order_line_2_pkey on order_line_2 order_line (cost=0.00..12.38
rows=10 width=36) (actual time=0.016..0.020 rows=7 loops=1)
Index Cond: ((ol_w_id = 2) AND (ol_d_id = 2) AND (ol_o_id = 2))
Total runtime: 0.180 ms
子表の絞り込みに、作成した索引を使用できるので、性能面で差が出ています。
ちなみに、チェック制約を使って子表を特定すればいいのに、何でシーケンシャルスキャン
をしなければならないのかよく分かっていません。。
----------------------------------------------------
NTTコムウェア(株) 吉田敏和
pgsql-jp メーリングリストの案内