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