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