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