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