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

Tatsuo Ishii ishii @ sraoss.co.jp
2010年 11月 11日 (木) 18:36:25 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万レコードあり、この応答がとても遅いです。

元のテーブルが何万レコードあろうと、シーケンステーブルは常に1行しかない
ので、

SELECT 1 FROM "テーブル"_シーケンス FOR UPDATE;

が遅いというのはちょっと解せないのですが、このSELECT文を手動で直接psql
などから実行してもやはり遅いのでしょうか?

> マニュアルにある、「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 mailing list
> pgpool-general-jp @ sraoss.jp
> http://www.sraoss.jp/mailman/listinfo/pgpool-general-jp


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