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

Daisuke Yamazaki yamajaki @ gmail.com
2006年 11月 21日 (火) 17:51:25 JST


こんにちは.山崎と申します.

On Tue, 21 Nov 2006 17:02:38 +0900
河本陽一 <komoto.yoichi @ kcc.co.jp> wrote:

>  毎日1回、大量のデータ(1000万件)をひとつのトランザクションで投入し
> ようとしています。PostgreSQLは、7.4を使用しています。
>  投入速度が遅いため、投入時は最低限のINDEX以外を削除することで性能
> が出るようになりました。
>  しかし、データ投入の間(時間にして約8時間20分)は、INDEXがないために
> SELECTの性能が出なくなってしまいます。
>  これでは使用する上で困るので、回避方法を探しています。
> 
>  データ挿入の処理速度を上げる方法を調べてみましたが、いずれも思うよ
> うな動作となりませんでした。
> ・COPYを使用する
>  →既存データがないので使用不可

これなのですが,
http://www.postgresql.jp/document/pg746doc/html/sql-copy.html
> また、COPY FROM コマンドは、ファイルからテーブルへとデータをコピーします 
>(このとき、すでにテーブルにあるデータにコピー内容を追加します)。

とありますので,既存テーブルにデータがあるのなら,元データがファイルの形で
存在しなくても挿入するデータさえあれば問題ないと思います.

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

状況が許すならば個人的に8.1.4をものすごくオススメしたいところです.
AMD Athlon(tm) 64 X2 Dual Core Processor 3800+
SATA2
FreeBSD6.1

create table test_table(
   id                integer ,
   id2               integer ,
   data1             int8,
   data2             int8,
   slot_time_at      timestamp,
   id3               integer ,
   varchardata       varchar(128)
)
create index idx_id_slot on test_table (id,slot_time_at);

なテーブルに対して1.5億レコードをCopyしたみたところ35分程度とものすごく
優秀な結果でした.

-- 
プログラマ集団 スケールアウト
Daisuke Yamazaki <yamajaki @ gmail.com>
Blog:最速配信研究会
http://d.hatena.ne.jp/yamaz/




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