[pgsql-jp: 29725] substring を使用した場合の検索結果について

Hirokazu Matsumura matsumurah @ citizen.co.jp
2003年 4月 25日 (金) 19:54:21 JST


皆様こんばんは。松村と申します。
今回、初めて投稿させて頂きます。

現在、MSDE(SqlServer)から、PostgreSQLへ移行を行っております。
しかし、Select文での検索が非常に遅くて困っております。
(同一SQLにて、SqlServerでは数秒のものがPostgreSQLでは数十秒かかる)

実際の業務では、
2万件程度のデータを主として、substringで切り出した項目で
10万件程度のデータの項目にあてています。
(where substring(test01.col3,1,10) = test2.col1)

必要と思われる項目にindexを設定し、vacuumをかけたのですが
速度が改善されませんでした。
そこで、explain analyzeを使用してどの程度実行時間が
かかっているのか調べているのですが...

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
動作環境
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
CPU         Pentium2 333MHz
memory      128MB
Linux version 2.4.18-3
PostgreSQL 7.3.1
PHP 4.3.1

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
テーブル情報(名称は適当です)
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Table "public.test01"
Column      Type                          Modifiers
col1  character varying(9)    not null
col2  character varying(6)
col3  character varying(13)
...
col10
Indexes: test01_pkey primary key btree (col1),
         col2 btree (col2),
         col3 btree (col3)

データ件数:20000件程度です。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
実行結果1
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
explain analyze
select *
from test01
where col1 = '99XXX';
 Index Scan using test01_pkey on test01  (cost=0.00..3.34 rows=1
width=238)
 (actual time=18.88..18.88 rows=1 loops=1)
   Index Cond: (col1 = '99XXX'::character varying)
 Total runtime: 1.15 msec
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
実行結果2
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
explain analyze
select *
from test01
where substring(test01,1,9) = '99XXX';
Seq Scan on test01  (cost=0.00..1191.36 rows=108 width=238)
 (actual time=175.69..345.42 rows=1 loops=1)
   Filter: ("substring"((col1)::text, 1, 9) = '99XXX'::text)
 Total runtime: 345.73 msec
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
と、以上の様になっておりました。
実行速度が遅いのは、substring関数を使用しているからなのか?
とも思うのですが、検索方法が「Index -> Seq」になってしまっている
のが何故かわかりません。
(これもsubstring関数を使用している事と関係が有るのでしょうか?)

私としては、ここの部分が検索時間を遅くしている原因ではないか?
と思っているのですが...

これを解決する方法は有るのでしょうか?
又、調査をする上でのヒントとなるような事が有りましたら
教えて頂けないでしょうか?

----------------------------------------------
松村 浩一
----------------------------------------------




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