[pgsql-jp: 37713] Re: INDEX を残したまま大量データを高速に挿入したい
a.mitani @ sra-europe.com
a.mitani @ sra-europe.com
2006年 11月 22日 (水) 17:42:11 JST
>> INSERTとUPDATEが混在しているということですね.
>> INSERT文だけ別にCOPY文にするというのはどうでしょう.
>> UPDATE文の方が多いと解決になりませんが...
>
> UPDATEかINSERTかを判断するには、既存データかどうかを判断する必要が
> あると思います。
> そのためにはデータをどこかに覚えおかないといけないですよね。
> どこに覚えておくかといえば、DBが最適だと思うので、INSERTとUPDATEは
> 同時に行わないといけないと思います。
まず,勝手に想定していたことなのですが,
入力データの対象レコードが存在するかどうかをDBに問い合わせて判断し,
なければINSERT文,あればUPDATE文を作っているのだろうと思っていました.
ここでINSERT文の代わりにCOPY文のデータにしてやれば,COPYでデータ投入が可能に
なります.
もしUPDATE文の方が圧倒的に多い場合,上記の方法によるパフォーマンスの向上はほ
とんどないと思います.
その場合,UPDATE文の代わりにDELETE+INSERTにして,INSERTの代わりにCOPYデータ
を作成すれば,全てのデータ投入をDELETE+COPY文で実行できます.
データスキームにも依りますが,1000万件程度のCOPYの実行であれば,
数十秒から数分で終わることが期待できると思います.
単純にINSERTとCOPYを比較した場合,パースやプランが省かれるのでCOPYの方が圧倒
的に早いのはご存知だと思います.
データ投入のパフォーマンスを上げたいのであれば,できるだけCOPY文で実行できる
ように工夫されることをお勧めします.
最初の想定が間違っていたらごめんなさい.
三谷@オランダ
pgsql-jp メーリングリストの案内