[pgsql-jp: 29460] インデックスの利用について
shiina
shiina @ senpo.com
2003年 3月 22日 (土) 13:31:29 JST
椎名と申します。
よろしくお願いします。
PostgreSQL 7.3.2を使用していて少し疑問に思いましたので
お教え下さい。
以下のようなテーブルがあります。
table1
create table table1(
t1_key_p1 varchar(10),
t1_key_p2 integer,
t1_key_p3 integer,
t1_key_s1 varchar(20),
t1_key_s2 varchar(50),
t1_data1 integer,
t1_data2 integer,
primary key (t1_key_p1, t1_key_p2, t1_key_p3)
);
create index table1_key1 on table1
(t1_key_p1, t1_key_s1, t1_key_s2, t1_key_p2);
データ件数は約100万件です。vaccum full, analyzeはしてあります。
このテーブルに対し
explain select t1_key_s2 from table1
where t1_key_p1 = 'aaa'
and t1_key_s1 = 'bbb'
and t1_key_s2 >= '999'
group by t1_key_p1, t1_key_s1, t1_key_s2;
を実行すると
Group (cost=56581.99..56745.32 rows=1633 width=31)
-> Sort (cost=56581.99..56622.82 rows=16333 width=31)
Sort Key: t1_key_p1, t1_key_s1, t1_key_s2
-> Seq Scan on table1 (cost=0.00..55439.06 rows=16333 width=31)
Filter: ((t1_key_p1 = 'aaa'::character varying)
AND (t1_key_s1 = 'bbb'::character varying)
AND (t1_key_s2 >= '999'::character varying))
Seq Scan(?)になり非常に遅くなります。そこで
set enable_seqscan = false;
として同じクエリーを実行すると
Group (cost=0.00..63985.26 rows=1633 width=31)
-> Index Scan using table1_key1 on table1
(cost=0.00..63862.77 rows=16333 width=31)
Index Cond: ((t1_key_p1 = 'aaa'::character varying)
AND (t1_key_s1 = 'bbb'::character varying)
AND (t1_key_s2 >= '999'::character varying))
となり早いです。
(ちなみに結果は1件です。)
postgresql.confを書き換えるのは他に影響がありそうですし、
毎回"set enable_seqscan = false"をするしかないでしょうか?
pgsql-jp メーリングリストの案内