[pgpool-general-jp: 848] シーケンスを含むテーブルへのINSERTが遅い

N.Ezawa ezawa @ birds.co.jp
2010年 11月 11日 (木) 15:01:15 JST


初めまして 江沢と申します。

pgpoolII 3.0.1 をレプリケーションモードで運用しています。
 replication_mode = true
 load_balance_mode = true
 replication_stop_on_mismatch = false
 replicate_select = false
 insert_lock = true
バックエンドはPostgreSQL8.4 × 2台です。

この状態で、シーケンスをデフォルト値として持つテーブルに
INSERTを行った場合、応答がとても遅く困っています。
※ seq integer not null DEFAULT nextval('シーケンス')

insert_lock = true としているので、テーブルの明示的ロック
と思っていたのですが、実際には「LOCK TABLE ...」ではなく、
「SELECT 1 FROM "テーブル"_シーケンス FOR UPDATE;」がpgpoolにより
実行されていました。
該当テーブルは約500万レコードあり、この応答がとても遅いです。

マニュアルにある、「LOCK TABLE ...」が実行されるようにするには、
何か設定が必要なのでしょうか。

ソースを確認すると、pool_process_query.c Line. 2750 あたりの
lock_kind == 2 がキーになると考えています。

/* row lock for sequence table? */
if (lock_kind == 2)
{
  (... snip ...)

  snprintf(qbuf, sizeof(qbuf), "SELECT 1 FROM %s FOR UPDATE", seq_rel_name);
}
else
{
  /* Issue lock table command */
  snprintf(qbuf, sizeof(qbuf), "LOCK TABLE %s IN SHARE ROW EXCLUSIVE
MODE", table);
}

以上、よろしくお願いします。

-- 
Nobutaka Ezawa
BIRDS Systems Research Institute, Inc.
mailto:ezawa @ birds.co.jp


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