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

河本陽一 komoto.yoichi @ kcc.co.jp
2006年 11月 24日 (金) 14:03:54 JST


こうもとです。

Tietew さんの書いたこと:
> INSERT INTO t1_temp2 SELECT tdata, COUNT(*) FROM t1_temp1 GROUP BY tdata;
> 
> こんな感じでSQL上で集計して、
> 
> BEGIN;
>   UPDATE t1 SET tcnt = t1_temp2.tcnt FROM t1_temp2 WHERE tdata = t1_temp2.tdata;
>   INSERT INTO t1 SELECT * FROM t1_temp2 LEFT JOIN t1 USING (tdata) WHERE t1.tdata IS NULL;
> COMMIT;
> 
> 更新と新規レコードの挿入がそれぞれSQL一回ずつでできます。
> 
> ただ、全件スキャンが3回はいるので、速いかどうかは保証の限りでは
> ありません。

 集計処理の設計上、既存のレコードを更新することはなく、そのときに追
加するデータ内での集計ですむため、UPDATEはいらなくなります。
 このため、集計データをそのまま追加するだけでよいのですが、実際には
複数のテーブルで、外部キーとかも使用しているため、今までいただいた処
理方法を参考に、実装を考えて見ます。


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




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