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

Tietew tietew @ tietew.net
2006年 11月 24日 (金) 18:14:19 JST


On Fri, 24 Nov 2006 14:03:54 +0900
In article <20061124135830.614D.KOMOTO.YOICHI @ kcc.co.jp>
[[pgsql-jp: 37720] Re: INDEX を残したまま大量データを高速に挿入したい]
河本陽一 <komoto.yoichi @ kcc.co.jp> wrote:

> こうもとです。
> 
> 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はいらなくなります。

んであればLEFT JOINも必要ないですね。

テンポラリテーブルに集計した後
  INSERT INTO t1 SELECT * FROM t1_temp2;
で一気に挿入してやれば良いだけになります。



―[ Tietew ]――――――――――――――――――――――――――――
Mail: tietew @ tietew.net / tietew @ raug.net
Web : http://www.tietew.net/     Tietew Windows Lab.
PGP fingerprint: 26CB 71BB B595 09C4 0153  81C4 773C 963A D51B 8CAA




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