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