PostgreSQLで巨大データを扱うときのTIPS

1つ目が「indexは後からつける

create table test (
 id integer,
 title varchar(255)
);

こんなテーブルにCOPYでインポートするとき、

create index test_idx on test(title);

こういったindexを先につけてから実行すると30万行のデータで10分程度。6000万行あると72時間程度経っても終わらず。
indexなしなら10分で6000万行いけました。データが入った後のcreate indexには1~2時間。

動作環境はCPU 2.80GHz、Memory 1GでFedoraCore5にPostgreSQL8.1.4。

2つ目が「テーブルごとにデータをエクスポートするときはpg_dumpではなくてCOPY
バックアップ用のpg_dumpを使うと簡単ですが、-tでテーブルを指定するとCOPY文にならずにINSERT文で出力される。オプションで指定しなくてもそうなってしまうのでちょっと謎。COPY TO~でエクスポートすれば確実にCOPY用のタブ区切りテキストで出力される。

3つ目が「pg_ctl kill TERM [PID]で無理矢理止める
長時間かかるSQLをnohupなどで実行した時はpsでプロセスIDを確認したあと

pg_ctl kill TERM 10190

などとして止める。ちなみにMySQLのときは

mysqladmin processlist(idのリストが表示される)
mysqladmin kill id

巨大データ関係では、MLでも質問が出ていました。
[pgsql-jp: 35499] 巨大なテーブルの移行

PowerGresは速いらしい。
第 3 回 高速 COPY コマンドの活用 – 性能チューニングのポイント

This entry was posted in いじる. Bookmark the permalink. Both comments and trackbacks are currently closed.

2 Comments

  1. Posted 2006/10/23 at 2:50 am | Permalink

    > PowerGresは速いらしい。

    リンク先の解説は「PowerGres」ではなくて「PowerGres Plus」ですね。
    上記2つは別モノで、「Plus」はPostgreSQLの足回りを富士通がカスタマイズしたモノです。

    性能は良さそうですが、お値段も全然違います!
    http://powergres.sraoss.co.jp/s/ja/product/onLinux.php#price
    http://powergres.sraoss.co.jp/s/ja/product/Plus.php#price

  2. Posted 2006/10/23 at 8:46 am | Permalink

    なるほど。
    情報ありがとうございます。

One Trackback

Page optimized by WP Minify WordPress Plugin