[pgsql-jp: 37702] INDEXを残したまま大量データを高速に挿入したい

河本陽一 komoto.yoichi @ kcc.co.jp
2006年 11月 21日 (火) 17:02:38 JST


こうもとです。

 毎日1回、大量のデータ(1000万件)をひとつのトランザクションで投入し
ようとしています。PostgreSQLは、7.4を使用しています。
 投入速度が遅いため、投入時は最低限のINDEX以外を削除することで性能
が出るようになりました。
 しかし、データ投入の間(時間にして約8時間20分)は、INDEXがないために
SELECTの性能が出なくなってしまいます。
 これでは使用する上で困るので、回避方法を探しています。

 データ挿入の処理速度を上げる方法を調べてみましたが、いずれも思うよ
うな動作となりませんでした。
・COPYを使用する
 →既存データがないので使用不可
・INDEXの削除
 →上記問題でSELECTの性能が出ないので見送り
・DBチューニング
 →7.4なので maintenance_work_mem は使用不可
 →checkpoint_segments を60にし、topでIO待ちが3%程度でも性能出ず
 →sort_mem を65536にしても性能でず

 挿入のトランザクションが終わるまではそのデータは見えないので、表示
にしか必要ないINDEXは更新しない方法がないか探してみましたが、見つか
りませんでした。

 INDEXの削除や追加をトランザクションの中に入れてみましたが、こうす
ると削除したINDEXを使用しているテーブルの問い合わせでロックがかかっ
てしまい、トランザクションが終わるまで戻ってきませんでした。

環境
  Redhat Linux ES4 (Kernel 2.6.9-42)
  PostgreSQL 7.4.13

======================================================================
河本陽一(こうもとよういち)
mailto:komoto.yoichi @ kcc.co.jp




pgsql-jp メーリングリストの案内