[pgsql-jp: 40178] Re: update文のフリーズ

Fujii Masao masao.fujii @ gmail.com
2010年 2月 17日 (水) 13:52:47 JST


2010/2/17 Eiichiro Sakai <sakai @ agate-japan.com>:
> 1についてですが、SQLログというのはpostgresサーバで出力されているログで
> 「log_min_duration_statement = 0」にして出力しております。
> ログの抜粋を下記添付させていただきますが、下記出力後同一pid(28636)のログが
> 出力されていない状況となっておりました。
> fujii様よりexecute messageが届いてるかどうかというご指摘をいただいたのです
> が、
> ログを見るとSQL文を実行される際、最後のupdate文で「parse」「bind」が出力され
> ていて、
> 「execute」が出力されていない状況です。
> 「bind」と「execute」の間はpostgres内部の処理と認識していたので、
> SQLの実行メッセージは届いていると認識しておりました。

了解しました。

> 2010-02-10 13:00:31 JST [28636] LOG:  duration: 0.081 ms  parse <unnamed>:
> update AAA set column_1 = $1, column_2 = $2, column_3 = $3, column_4 = $4,
> column_5 = $5, column_6 = $6, column_7 = $7, column_8 = $8, column_9 = $9,
> column_10 = $10, column_11 = $11, column_12 = $12, column_13 = $13,
> column_14 = $14, VERSION = VERSION + 1 where AAA_id = $15 and VERSION = $16
> 2010-02-10 13:00:31 JST [28636] LOG:  duration: 0.097 ms  bind <unnamed>:
> update AAA set column_1 = $1, column_2 = $2, column_3 = $3, column_4 = $4,
> column_5 = $5, column_6 = $6, column_7 = $7, column_8 = $8, column_9 = $9,
> column_10 = $10, column_11 = $11, column_12 = $12, column_13 = $13,
> column_14 = $14, VERSION = VERSION + 1 where AAA_id = $15 and VERSION = $16
> 2010-02-10 13:00:31 JST [28636] DETAIL:  parameters: $1 = 'xxx', $2 = 'xxx',
> $3 = 'xxx', $4 = 'xxx', $5 = 'xxx', $6 = 'xxx', $7 = 'xxx', $8 = 'xxx', $9 =
> 'xxx', $10 = 'xxx', $11 = 'xxx', $12 = 'xxx', $13 = 'xxx', $14 = 'xxx', $15
> = '9', $16 = 'xxx'

このとき、pg_stat_activity では pid = 28636 はどのような内容になっていたでしょうか?
"waiting" 列が "t" となっていた場合は、UPDATE 文はロックで待たされています。その場合は、
UPDATE 文と競合する SQL が他になかったか確認してみてください。

例えば、SELECT FOR UPDATE では where 句の条件は "AAA_id = $1" のみですが、UPDATE 文
では "AAA_id = $15 and VERSION = $16" と条件が増えています。このため、VERSION を
条件に SELECT FOR UPDATE 等を行っている SQL が他に存在すると、UPDATE 文だけ競合が
発生することになります。

-- 
Fujii Masao
NIPPON TELEGRAPH AND TELEPHONE CORPORATION
NTT Open Source Software Center


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