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

Tietew tietew @ tietew.net
2006年 11月 22日 (水) 21:20:06 JST


On Wed, 22 Nov 2006 18:31:17 +0900
In article <20061122180943.5D44.KOMOTO.YOICHI @ kcc.co.jp>
[[pgsql-jp: 37714] Re: INDEX を残したまま大量データを高速に挿入したい]
河本陽一 <komoto.yoichi @ kcc.co.jp> wrote:

> ●データ
> aaaaa
> bbbbb
> ccccc
> ccccc
> aaaaa
> ccccc
> 
>  結果的に、以下の常態になることを望んでいます。
> 
> tdata  | tcnt
> -------+------
> aaaaa  |    2
> bbbbb  |    1
> ccccc  |    3

これだけならば、
一時テーブルに ●データ をソノママ挿入してあげてから、

CREATE TEMP TABLE t1_temp1 ( tdata TEXT );
CREATE TEMP TABLE t1_temp2 ( tdata TEXT, tcnt INTEGER );
COPY t1_temp1 FROM STDIN;
(略)
\.

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回はいるので、速いかどうかは保証の限りでは
ありません。



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