[pgsql-jp: 29026] Like を使った前方一致検索時のインデックス使用条件について

Hajime Lucky Okada paraiso @ luckyo.8m.com
2003年 2月 13日 (木) 17:28:33 JST


こんにちは、岡田と申します。 お世話になっております。

表題の件に関し、非常にシンプルなテープル構成に関わらず
使用/設定方法が悪いのか、人間の期待した動きをしてくれません。

それは、ある単一カラムの % を使用した前方一致の検索です。


次に示す検索対象カラム mitumori は、text 型で実質 全て 6 桁の英文字、
高々 1 万件程度です。
このカラムには、通常の方法でインデックスを作成しています。
create index idx1_plan on kenmei(mitumori);

このカラムに対し、次の様に 'SI' から始まるレコードを検索してみました。
select plan_id, kenmei from kenmei where mitumori LIKE 'SI%';
マシン自体が貧弱なせいもあり、返事の返ってくるまで うっと考えているのが分かり、
もしかしてということで explain を掛けてみました。

xxxdb=> explain select plan_id, kenmei from kenmei where mitumori LIKE 'SI%';
                           QUERY PLAN
----------------------------------------------------------------
 Seq Scan on kenmei  (cost=0.00..421.15 rows=1402 width=38)
   Filter: (mitumori ~~ 'SI%'::text)
(2 rows)

インデックス検索を期待していたのですが、結果は sequential scan でした。
正規表現を使用しても変わりません。


そこで、検索条件を 'SIa%', 'SIaa%' と一文字ずつ固定文字桁を増やしていくと、
何と 'SIaaa%' の段階でやっとインデックスを使用してくれた事を確認出来ました。
(でも、これは結局 最後の一桁だけが未定の検索条件になってしまっています。。)

xxxdb=> explain select plan_id, kenmei from kenmei where mitumori LIKE 'SIaaa%';
                                              QUERY PLAN
--------------------------------------------------------------------
 Index Scan using idx1_plan on kenmei  (cost=0.00..368.53 rows=115 width=38)
   Index Cond: ((mitumori >= 'SIaaa'::character varying) AND (mitumori < 'SIaab'::character varying)
)
   Filter: (mitumori ~~ 'SIaaa%'::text)
(3 rows)


インデックスを使用していても explain が示す この cost の大きさは気になりますが、
「どういう基準」でインデックスを使用する/しないを決めているのでしょぅか?
解説のページを探しているのですが、まだ見つかってません。

ちなみに、検索結果に相当するのはたったの 4 件、検索結果が多すぎる という状況は
当たりません。また、vaccumdb -z は、毎晩一回走らせています。

環境は、
OS:  Solaris 2.6
Postgres 7.3.2
gcc version 2.95.3 を使用し、
./configure --enable-multibyte --enable-syslog --without-zlib
でビルドしたものです。(既に default enable のものもありますが(^^;;)


これについて何かヒントがありましたら 宜しくお願い致します。
岡田はじめ






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