[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 メーリングリストの案内