Hatena::Grouppostgresql

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

2010-05-21PGCon 2010 カンファレンス1日目 このエントリーを含むブックマーク このエントリーのブックマークコメント

そろそろ代わり映えのしないランチにゲンナリし始めていますが、そんな中、カンファレンスの1日目が始まりました。3セッションが並行して進められているので全部は聞けてませんが、手分けして聴講している中で興味深いセッションを紹介します。

Not Just UNIQUE - Exclusion Constraints

PostgreSQL 9.0 の新機能「排他制約」の解説でした。排他制約は UNIQUE 制約を一般化した、一貫性のための機能で、テーブル内の他の行の中に指定した演算子が真になるものが無いことを保証できます。演算子が = の場合には既存の UNIQUE 制約と同じ効果になります。*1

特に興味深かったのは、複数の列値を含むようなケースです。

CREATE TABLE reservation ( room text, during period,
  EXCLUDE USING gist ( room WITH = , during WITH && )
);

という例が示されていました。「同じ部屋を時間が重なるようには予約できない」という意味になります。注意としては、text型は デフォルトでは gist インデックスに対応していないので contrib/btree_gist をインストールする必要があることです。また、period 型は 9.1 向けに開発されている範囲型を先取りした独自の拡張モジュールとのこと。

さらに、もし自前で <> 演算子を含む gist 演算子クラスを定義できるのならば、

EXCLUDE ( 檻ID WITH = , 動物種別 WITH <> )

のようにすることで、「同じ檻には同じ種類の動物しか入れられない」ような制約もデータベース側で保証できるのでは?ということでした。

The PostgreSQL Query Planner

Executorノードそれぞれ (NestLoop vs. MergeJoin vs. HashJoin 等) の解説でした。特に初心者がもう一歩内部の動作も勉強してみたいというような場合に最適なネタだと思われます。「江戸っ子」こと (?) Robert Haas の英語はとても聞き取りやすいですし。

メッセージをひとつ拾うとしたら、「Hash Join はとても速いので、なるべく Hash Join に落ちるようにすべし」というところでしょうか。自分のこれまでの経験でも、「Merge Join を目にしたら、work_mem を増やして Hash Join にプランを変更せよ」というパターンが多かったので、見解は一致します。

懇親会にて

(PostgreSQLの生みの親である) Stonebraker が、新しく Volt DB っての作ったんだが知ってるか? みたいな話がありました。スケールアウト可能なメモリDBであるものの、キー・バリューストアではなく、きちんとRDBMSをやっているそうです。Postgres-XC もやっと一般に公開されたようですが、用途的には被るところがあるので要チェックです。

えるしっているか

Tom Lane はキーボードを叩くとき、薬指と小指を使わない。

*1:機能面では、排他制約は UNIQUE 制約の上位互換なのですが、同じ処理をやらせるぶんには既存のコードのほうがパフォーマンスが高いので、UNIQUE制約とは実装は分かれています。