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 コマンドの活用 – 性能チューニングのポイント
> 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
なるほど。
情報ありがとうございます。
[...] PostgreSQL