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