[pgsql-jp: 38721] ソートとインデックスの関係

YAMANEKO/Mao yneko2 @ yamamaya.com
2007年 9月 3日 (月) 15:26:55 JST


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

諸般の事情でいまだに、PostgreSQL 7.4.7を使っているのですが・・・
クエリプランナーをうまく手なずけられず、困っています。
以下のようなテーブルで・・・

            Table "public.maillist"
   Column   |          Type           | Modifiers
------------+-------------------------+-----------
 session_id | character(65)           | not null
 rcv_date   | character(24)           | not null
            | 以下略                  |
Indexes:
    "i_maillist" btree (session_id)
    "i_maillist2" btree (rcv_date)

以下のようなクエリを実行しようとすると、
何度、vacume analyzeしても、
シーケンシャルスキャンを止めようとしません。

  select  *
  from    maillist
  where   session_id = '1'

以下のクエリでは、シーケンシャルスキャン+ソートとなって、
非常に遅くなります。

  select  *
  from    maillist
  order   by rcv_date

強制的に、

  set enable_seqscan to false

を設定すると、両クエリともインデックススキャンになって、
十倍以上高速になるのですが・・・
以下のようなクエリだと、
やはり、i_maillist でインデックススキャンをした後に rcv_dateでソート、
という形になって、遅くなってしまいます。

  select  *
  from    maillist
  where   session_id = '1'
  order   by rcv_date

session_idによっては「ごく希」に i_maillist2 と i_maillist1 を使った
インデックススキャンになるので、プランナのパラメータの問題?
というような気がするのですが・・・

どうやったらうまく、プランナを手なずけれるでしょうか?

あるいは、作業コストとの兼ね合いもあるので要検討ですが・・・
PostgreSQL 8にアップグレードするとこのあたりが改善されるとか、
ありますでしょうか?

- YAMANEKO / Mao
http://yamamaya.com/
http://wiki.livedoor.jp/yamamaya_com/




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