Hatena::Grouppostgresql

PostgreSQL 雑記 このページをアンテナに追加 RSSフィード

2010-11-01PostgreSQL 9.1 Alpha 2 このエントリーを含むブックマーク このエントリーのブックマークコメント

PostgreSQL 9.1 もスケジュール通りに Alpha 版がリリースされています。ダウンロードはこちらリリースノートからいくつか新機能を拾ってみます。

  • Support triggers on views
    • VIEW に INSTEAD OF トリガを定義できます。標準SQLで規定された仕様で、これでもう PostgreSQL 独自の RULE はお役御免でしょうか。
  • Allow WITH clauses to be attached to INSERT, UPDATE, DELETE statements
    • WITH (...) INSERT/UPDATE/DELETE ができるようになりました。WITH RECURSIVE も使えるので、再帰クエリの結果を元にテーブルを更新するようなケースで便利かもしれません。
    • ただし、まだ WITH のカッコ内では更新クエリは使えません。開発が続いています。
  • Allow new values to be added to an existing enum type
    • ALTER TYPE enum_type ADD 'new_value' [ (BEFORE|AFTER) 'old_value' ]
    • ENUM型に新しい値を追加できるようになりました。挿入位置も BEFORE, AFTER で指定できます。
  • Teach CLUSTER to use seqscan-and-sort when it's faster than indexscan
    • CLUSTER の際に、断片化が進んでいる場合は SeqScan してくれるようになりました。特に断片化が進んでいる大きなテーブルだと数倍高速です。
    • pg_reorg とも性能面では差は無くなりました。もちろん、まだ参照や更新できるのは pg_reorg の勝っている点ですが。
  • Support MergeAppend plans, to allow sorted output from append relations
    • ひさびさにパーティショニングの強化です。いわゆる ORDER BY の push down ができるようになりました。特にインデックスが張られた列で上位の数件を拾ってくる場合に、パーティショニングされていても効率よく処理できるようになります。
    • ただし、いまのところ最適化されるのは ORDER BY (+ LIMIT) だけ。min/max も似たような結果が得られるものの、今回の最適化は効かないのでご注意を。PG 7.4 の時代も似たような制約がありましたね。
    • と思ったら、Tom Lane 先生がアップを始めたようです。
=# EXPLAIN SELECT max(i) FROM parent; -- Seq Scan になっちゃう
               QUERY PLAN
----------------------------------------
 Aggregate
   ->  Append
         ->  Seq Scan on parent
         ->  Seq Scan on child_1 parent
         ->  Seq Scan on child_2 parent

=# EXPLAIN SELECT * FROM parent ORDER BY i LIMIT 1; -- Merge Append が使えている
                     QUERY PLAN
--------------------------------------------------------------------
 Limit
   ->  Result
         ->  Merge Append
               Sort Key: public.parent.i
               ->  Sort
                     Sort Key: public.parent.i
                     ->  Seq Scan on parent
               ->  Index Scan using child_1_i_idx on child_1 parent
               ->  Index Scan using child_2_i_idx on child_2 parent

……と、ちょっとずつ改良が進んでいます。同期レプリケーションやSQL/MEDといった目玉機能はまだまだ開発の途中です。

umitanukiumitanuki2010/11/02 01:27Limit自体のpush downは難しいのですかね。Index ScanならよいけどSortならLimit下げてくれないとあんま意味ない気もします。

pgsqlpgsql2010/11/02 08:22時系列データの末尾を見るなど、インデックスの張ってあるケースは多いという判断でしょうね。確かに Top-N sort をサポートしているので、Seq Scan + Sort になるパターンで Limit を push down するのは有効です。ただ、上位で絞込み条件が入る場合に「実は下位ノードでもっと数が必要だった」というケースに対処する必要があります。また、Limit ノードによるフィルタコストも無料ではないので、そのコストモデルも組み込むことになるでしょうね。盲目的な push down はできないのでは。