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

冨田 直人 ntomita @ pana.net
2003年 1月 21日 (火) 18:36:12 JST


齋藤さん、永安さんお返事ありがとうございます。

お二人が指摘されているように、このエラーの原因は単に
実行しているinsert文の中に、おかしな文字コード(つぶれた漢字のような文字)
が含まれていた為でした。

データを見てみると、1万5千件を過ぎた辺りから、ちらほらと
おかしな文字コードがデータに入っていました。

> > NOTICE:  current transaction is aborted, queries ignored until end of transaction block
>とあるのを見ると、1ブロック100件のどこかでエラーが出て、
>以降のINSERTが無視されているようです
まさにその通りでした。

> 件数はともかくとして、100件単位でcommitというのはどうなんでしょう。
> **99件目でエラーになった場合その前の98件の処理は全部捨てるんですか?
100件単位を1ブロックとして処理しますので、100件の中でエラーが出た場合は、
1ブロック(=100件)をrollbackします。
> また、失敗した行は捨てるというなら、autocommitでもよいのでは?

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

で、安永さんの計測結果、大変参考になりました。

以下は、7.2.1の場合ですが、
---------------------------------------------------------------------
> {32}snaga @ penguin:/tmp% time psql -f update.sql > /dev/null
> 0.780u 0.490s 7:04.23 0.2%      0+0k 0+0io 232pf+0w
> {33}snaga @ penguin:/tmp%  ; time psql -f update_autocommit.sql > /dev/null
> 0.660u 0.450s 7:11.42 0.2%      0+0k 0+0io 232pf+0w
> ---------------------------------------------------------------------
7.2.1ではAuto-commitがON,OFFあまり変わらないんですね。
じゃ、ONにして一件ずつcommitするようにし、エラーの物だけエラー用のファイルに
吐くような形でやっていこうと思います。

> ただし、7.3ベースになるとautocommitした方が速くて、
> ---------------------------------------------------------------------
> [snaga @ ia32-02s pgsql]$ time psql -f update.sql  > /dev/null 
> real    2m0.007s
> user    0m0.453s
> sys     0m0.309s
> [snaga @ ia32-02s pgsql]$ time psql -f update_autocommit.sql  > /dev/null 
> real    0m23.056s
> user    0m0.406s
> sys     0m0.377s
> [snaga @ ia32-02s pgsql]$ head update_autocommit.sql 
> ---------------------------------------------------------------------
> となります。1回コミットするより10000回コミットした方が速い理由は、
> よく分かってません(7.2.1とは違うマシンです)。
へぇー、どうしてなんでしょう?
また手が空いたら、7.3にバージョンアップして検証してみようと思います。

以上、ありがとうございました。>齋藤さん、永安さん
-- <ntomita @ pana.net> --




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