PostgreSQL

基本的な使い方

サーバー乗り換え

データベースはバージョンによって中のデータの保存形式は違うかもしれないけど、 見かけ上のデータはSQLの文法に従っているから、簡単に引っ越しができるはず。 「方言」のおかげでなかなかそうもいかないけど。
以下はpostgres同士の乗り換えの話。 基本は、
$ pgdump hoge-db > hoge-dump.sql
とすると、hoge-dump.sqlにデータベースを作ったときに発行したコマンドが並ぶから、 これを引っ越し先で
$ psql  hoge-db < hoge-dump.sql
とすれば完了…なはず。だけどなかなかうまくいかない。
とりあえずデータが移ればいいなら、テーブル一つずつcopyするのが良さげ。
$ psql hoge-db
hoge-db=# \copy test-table to "test-table.sql"
とやって、移行先のDBでtest-tableを作った上で、
$ psql hoge-db
hoge-db=# \copy test-table from "test-table.sql"
とすると、テーブルの中身を移行できる。

インデックス使ってよ!

postgresですごく簡単なテーブルを作って、クエリをするんだけど、インデックスを使ってくれない。
> create table members(id int2 primary key, name char(16));
NOTICE: ... create implicit index "members_pkey" for table "members"

> insert into members values(0, 'kei');
> insert into members values(1, 'rei');
...(大量にinsert)
> select name from members where id = 1;
...(遅い)
idに対してインデックスがあるはずなのに、なんかすごく遅い。ecplainしてみると
> explain select name from members where id = 1;
                       QUERY PLAN                        
---------------------------------------------------------
 Seq Scan on members  (cost=0.00..22.50 rows=1 width=52)
   Filter: (id = 1)
(2 rows)
シーケンシャルスキャンになってる。
vacuum analyze (select方法のキャッシュを削除) しても同じ。
でも、1を''で囲むとなんか速くなった。explainしてみると
> explain select name from members where id = '1';
                                 QUERY PLAN                                  
-----------------------------------------------------------------------------
 Index Scan using members_pkey on members  (cost=0.00..4.82 rows=1 width=52)
   Index Cond: (id = 1::smallint)
(2 rows)
ちゃんとIndex Scanしてる。
どうやら、int2やint8に対する比較は、値の方に''を付けないと、インデックスが用いられない模様。キャストの関係なんだろうけど、変な仕様…
☆この件に関しては、井谷さんにお世話になりました。