[pgsql-jp: 32966] 問い合わせの速度低下

Mao Morimoto yneko2 @ yamamaya.com
2004年 5月 18日 (火) 11:58:44 JST


たびたびお世話になってます。もりもとです。

PostgreSQL7.4.2を利用しているのですが、
パフォーマンス面で悩んでいまして・・

毎日24時間、5分おきに500レコードずつどんどん追加されていくテーブルがあ
ります。

TABLE T_RESULT
  TIME_SMPL   TIMESTAMP
  CHECK_ID    INTEGER
  CHECK_SUB   INTEGER
  以下、データフィールド
   :

このようなテーブルで、TIME_SMPL、CHECK_ID、CHECK_SUBの三つのフィールドが
重複キーのようになっていて、
TIME_SMPL の重複インデックス I_RESULT_1
CHECK_ID + CHECK_SUB の複合重複インデックス I_RESULT_2
TIME_SMPL + CHECK_ID + CHECK_SUB の複合重複インデックス I_RESULT_3
この、三つのインデックスを念のため設定してあります。

なぜインデックスが三つかというと、VACUUMした後におなじSELECT文をEXPLAINする
と、インデックスがどれか一つだけだと、時々シーケンシャルスキャンになってしま
うのです。三つあると、必ずどれか一つを使ってくれるようです。
(主に使われるのは、I_RESULT_1+Filterのパターンと、I_RESULT_3だけのパターン
のようです)

そこで、問題なのですが・・ CHECK_IDとCHECK_SUBとTIME_SMPLを条件としてレコー
ドを取り出すだけの簡単なSELECT文の実行時間が、データがたまるとどんどん遅く
なってしまうのです。(1日動かすと144000レコード増えて、SELECTの問い合わせに
かかる時間は20倍くらいになってしまいます)

遅くなったときに VACUUM ANALYZE するとまた元通り早くなるのですが、またしばら
くすると遅くなってきますし、データがたまってくるとVACUUM自体がとんでもなく時
間かかってしまうので、こまめに実行できる状況ではありません。。

もしかして、追加されたレコードについてはVACUUMするまでインデックスが有効にな
らないのでしょうか。。?
また、このような場合の何かいいパフォーマンス対策はありますでしょうか。。?

- Mao Morimoto
http://blog.yamamaya.com/




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