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