[pgsql-jp: 29468] Re: インデックスの利用について

sugita @ sra.co.jp sugita @ sra.co.jp
2003年 3月 24日 (月) 03:28:54 JST


  杉田です。

From: shiina <shiina @ senpo.com>
Subject: [pgsql-jp: 29460] インデックスの利用について
Date: Sat, 22 Mar 2003 13:31:29 +0900

;;; 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件です。)

  explain analyze の結果は、どうなるでしょうか?

;;; postgresql.confを書き換えるのは他に影響がありそうですし、
;;; 毎回"set enable_seqscan = false"をするしかないでしょうか?

  enable_seqscan = false をするとしても postgresql.conf ではせずに、

    set enable_seqscan to false;
    それでよいと確信を持てるクエリー;
    set enable_seqscan to true;

の方がいいと思います。


Kenji Sugita                                      



     
     




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