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

Hiroki Kataoka kataoka @ interwiz.jp
2003年 1月 21日 (火) 20:38:54 JST


片岡です。どうも。

  この辺は興味深いのでおじゃまします。

Satoshi Nagayasu <snaga @ snaga.org> wrote:
> 私がやったテストは以下のようなもので、
> ---------------------------------------------------------------------
> drop table update_test;
> create table update_test ( uid integer primary key, counter integer not null );
> insert into update_test values ( 1, 0 );
> -- begin;
> update update_test set counter = 0 where uid = 1;
> update update_test set counter = 1 where uid = 1;
> update update_test set counter = 2 where uid = 1;
> ...
> update update_test set counter = 9997 where uid = 1;
> update update_test set counter = 9998 where uid = 1;
> update update_test set counter = 9999 where uid = 1;
> -- commit;
> ---------------------------------------------------------------------
> という1万回のupdateをトランザクションでくるんだ場合と、
> autocommitで実行した場合です。

(略)

> ただし、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とは違うマシンです)。

  同じ行(uid = 1)を10000回更新していますが、PostgreSQLは追記型アーキテ
クチャです。BEGIN〜COMMITで囲んだパターンの最後の方は、更新対象の1行を探
すのが大変だったろうと察します。テーブルにデータが1行しか無かったとして
も、追記型アーキテクチャのために10000回目のUPDATEの直前では10000行のレコー
ドが物理的に存在していたはずですし、またこの中から本物の1行を探すのにイ
ンデックスは全く役に立たなかったと思います。だって10000行全部がuid=1です
(笑)。

  ここまでは7.2、7.3とも同様です。

  7.3ではCOMMIT時にインデックスが多少整理されるようになったため、今回の
場合はCOMMITが多く発生した方が「本物の1行」を見つけやすくなり、結果とし
てAUTO COMMITの方が速くなったのだと思います。

  でもこれって、かなり特殊なベンチマークパターンですよね。同じ1行
を1万回更新かつ1つのトランザクションブロックで囲む………(笑)。なので、
テーブルにインデックスが無かったり単純なINSERTだったり、あるいは更新対象
がばらけているUPDATEなどでは、当初の予想通りBEGIN〜COMMITの方が速いんじゃ
ないかと思います。試してませんが。

-- 
Hiroki Kataoka <kataoka @ interwiz.jp>





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