[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 メーリングリストの案内