2011年7月 6日

[pgsql-jp: 40853]パーティションプルーニングの説明文

吉田です。お世話になっております。

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コムウェア(株) 吉田敏和


投稿者 xml-rpc : 2011年7月 6日 09:29
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/104867
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。