[pgsql-jp: 28732] Re: current transaction is aborted について

Satoshi Nagayasu snaga @ snaga.org
2003年 1月 21日 (火) 18:49:45 JST


永安です。

冨田 直人 <ntomita @ pana.net> wrote:
> 今回、ブロック単位でcommitする理由は、パフォーマンスの向上が目的です。
> あるサイトで見たのですが、大量にデータをDBに入れる際のパフォーマンスのヒントとして、
> (1)Auto-commitをオフにする。
> (2)copy fromを使う。(データファイルを直接放り込む)
> (3)インデックスを削除しておく。(新規でデータを放り込む際のみ)
> と言うのを見ましたので、(1)のAuto-commitをオフにする方法を試みていた訳です。

常識的には、そう思うわけですよね。私もそう思っていたわけですが。

> 7.2.1ではAuto-commitがON,OFFあまり変わらないんですね。
> じゃ、ONにして一件ずつcommitするようにし、エラーの物だけエラー用のファイルに
> 吐くような形でやっていこうと思います。

これに関しては、他のパターンで試したわけではないので、
UPDATEとINSERTで挙動が違うとか、外部参照があると大きく変わってくるとかも
ありそうです。

先のメールで「実際に計測した方がいい」と書いたのはそのためです。

> > ただし、7.3ベースになるとautocommitした方が速くて、

> > となります。1回コミットするより10000回コミットした方が速い理由は、
> > よく分かってません(7.2.1とは違うマシンです)。
> へぇー、どうしてなんでしょう?

よく分かりません。

一応私もトランザクション周りのコードを読んでいるわけですが、
トランザクションブロックにすることで個々のINSERTのWALのフラッシュが
発生しなくなるので、パフォーマンスが向上するはずです。
autocommitの方が速くなるというのは、どう考えても謎です。

どこか必要な処理を飛ばしてしまっているのではないかという気がするのですが。。
あるいは、トランザクションブロックにしたときに、余計な処理をしている?

> また手が空いたら、7.3にバージョンアップして検証してみようと思います。

どなたか、他にINSERTやUPDATEのパフォーマンスの事例がありましたら、
ぜひ教えていただきたいです。


-- 
NAGAYASU Satoshi <snaga @ snaga.org>




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