[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 メーリングリストの案内