Hatena::Grouppostgresql

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

2011-11-22PostgreSQL9.2の新機能を拾ってみる このエントリーを含むブックマーク このエントリーのブックマークコメント

PG9.1と9.2の索引ページを比べて、9.2の新機能を拾ってみました。この他、マルチコアでのスケーラビリティが大幅に向上しているはずですが、性能なので索引には載りませんね。

時間があるときに追ってみます。

2011-11-15PG9.2 範囲型 このエントリーを含むブックマーク このエントリーのブックマークコメント

PostgreSQL 9.2 で「範囲型 (Range Types)」が採用されます。範囲型は、{ 下限, 上限 } をペアで扱うデータ型で、数直線上の「範囲」を表現することができます。また、配列と同様、要素として各種スカラー型を選べます。整数の範囲、数値の範囲、日時の範囲など、用途にあわせて型を選択できます。

9.0 で追加された「排他制約」は、これまでは主に地理データ (box, circle 等) の重なりのチェックに使えましたが、9.2 では「数値や時間の幅」を保証することもできるようになります。用途としては、「有効期限開始 / 終了」を持っているようなデータは結構多いような気がしますし、用途も広がったのではないでしょうか。

以下、範囲型、範囲型関数、排他制約を使った簡単な例です。[1] と [2] は、同じ部屋で予約時間帯が重なっているのでエラーになりますが、[1] と [3] は部屋が異なるので問題ないことがわかります。

=# CREATE EXTENSION btree_gist;
=# CREATE TABLE reservation (
     room   text,
     during tsrange, -- range of timestamp
     EXCLUDE USING gist (room WITH =, during WITH &&)
   );
=# INSERT INTO reservation VALUES ('123A', '[2010-01-01 14:00, 2010-01-01 15:00)'); -- [1]
=# INSERT INTO reservation VALUES ('123A', '[2010-01-01 14:30, 2010-01-01 15:30)'); -- [2]
ERROR:  conflicting key value violates exclusion constraint "reservation_room_during_excl"
=# INSERT INTO reservation VALUES ('123B', '[2010-01-01 14:30, 2010-01-01 15:30)'); -- [3]
-- lower/upperで下限/上限を取り出し
=# SELECT room, lower(during), upper(during) FROM reservation;
 room |        lower        |        upper
------+---------------------+---------------------
 123A | 2010-01-01 14:00:00 | 2010-01-01 15:00:00
 123B | 2010-01-01 14:30:00 | 2010-01-01 15:30:00
(2 rows)

2011-10-27第21回しくみ勉強会:全文検索(後編) このエントリーを含むブックマーク このエントリーのブックマークコメント

10/29 (土) の「第21回しくみ分科会+アプリケーション分科会勉強会」で、全文検索の続きを話します。pg_trgmにも無視できない問題があった話と、そろそろ引退させたいものの代わりが見つからない textsearch_senna を中心に。

2011-10-24WEB+DB 65 PostgreSQL 9.1 特集 このエントリーを含むブックマーク このエントリーのブックマークコメント

技術評論社 WEB+DB PRESS Vol.65 で、PostgreSQL 9.1 特集を執筆しました。

  • 新機能レビュー
  • レプリケーション
  • 拡張機能

の3本立てです。

2011-10-14textsearch_senna 9.1 対応 このエントリーを含むブックマーク このエントリーのブックマークコメント

9.1の途中で動かなくなっていた件にやっと追従。意外とすんなりは行きませんでした。

http://archives.postgresql.org/pgsql-committers/2011-10/msg00125.php

  • Relation->rd_operator がいつの間にかなくなっていた。
  • INIT_FORKNUM, MAIN_FORKNUM に少なくとも1ページを作成しておかないと怒られる。

特に後者の仕様って、何のつもりなんでしょう?ファイルが無いと問題があるケースでも見つかったんでしたっけ?

追記 : gincostestimate()を借りていたのが原因でした。gistcostestimate()に変更したい解消。

また、EXTENSION 化も考えたんですが、現状インストールスクリプト内で、pg_am への行の追加をしているんですよね。CREATE EXTENSION で INSERT の発行は可能そうなのですが、DROP EXTENSION は単なる依存オブジェクトの DROP なので、DELETE を発行できなさそう。テーブルを書き換えるタイプの EXTENSION は、9.1時点ではうまく対応できない気がします。