[pgpool-general-jp: 850] Re: シーケンスを含むテーブルへのINSERTが遅い
    N.Ezawa
    ezawa @ birds.co.jp
       
    2010年 11月 11日 (木) 20:09:11 JST
    
    
  
石井様
皆様
江沢です。
>
> SELECT 1 FROM "テーブル"_シーケンス FOR UPDATE;
>
> が遅いというのはちょっと解せないのですが、このSELECT文を手動で直接psql
> などから実行してもやはり遅いのでしょうか?
遅いです。
テーブル自体をSELECTしているようです。
結果が、テーブルの行数分返ってきます。
> 元のテーブルが何万レコードあろうと、シーケンステーブルは常に1行しかない
> ので、
これを、ヒントに色々わかりました。
問題1:INTEGER型 + default nexyval('seqname') が悪い
 
 pg_catalog.apdsrc ~ 'nextval' から attname を取得して
 SERIAL型のシーケンス名を作っているようです。
 snprintf(seq_rel_name, MAX_SEQ_NAME, "%s_%s_seq", table, atrname);
 今回の場合、シーケンス名はcreate sequence で指定した名前で、
 seq_rel_name と一致しませんでした。
 SERIAL型に変更したら、問題なく動きました。
問題2:table になぜかダブルクォーテーションがつく
 テーブル名    : tabname
 SERIAL型の列名: col
 とした場合、
 pgpoolが期待しているSQLは、おそらく
 SELECT 1 FROM tabname_col_seq FOR UPDATE;
 それが、なぜか
 SELECT 1 FROM "tabname"_col_seq FOR UPDATE;
 になります。
 ログに
 get_insert_command_table_name: extracted table name: "tabname"
 と出力されています。
 これが原因で、tabname を SELECTしているようで、応答が遅いみたいです。
さて、SERIAL型への変更はよいとして、テーブル名はどうしようもなく、
困っております。
get_insert_command_table_name()より中を見ていけば謎が解明できそうです。
また、明日頑張ります。
-- 
Nobutaka Ezawa
BIRDS Systems Research Institute, Inc.
mailto:ezawa @ birds.co.jp
    
    
pgpool-general-jp メーリングリストの案内