水曜以外もどうでしょう

北海道発。食べ歩きの記録グルメ情報や北海道の見どころなどをメモ替わりに書いています。

PREV | PAGE-SELECT | NEXT

≫ EDIT

postgresqlのlike検索でインデックスを使わせたい

likeでデータを探すのが遅いので高速化したい。

(1)そもそもが遅い
という問題と
(2)インデックスが使われていない

という問題がある。
(1)については、senna+ludiaを使って高速化する方法など試した。
これは、また別の機会に書くことにする。

(2)インデックスが使われない問題について書く。

そもそも、likeで
target like '%abc%' などと中間一致検索をしても、indexが使われないようだ。
これはネット上の皆さんも苦労されているのがうかがえた。

当方の環境
CentOS release 5
postgresql 8.1


今直面しているクリティカルな問題は、likeを使った前方一致検索のSQLだったので、
target like 'abc%'
前方一致だけはやっぱりindexを使いたいのだ。


# SET ENABLE_SEQSCAN TO OFF;
を使って、全走査をOFFにすると良いという情報を発見し、意気揚々だったが、当方の環境では期待通りに動かなかった。

インデックスが使われないことは、explain analyzeで確認
# explain analyze select count(*) from t where target like 'abc%';


次に発見したのは下記の情報。

「ロケール(国際化と地域化) - Let's Postgres」
http://lets.postgresql.jp/documents/technical/text-processing/2

ロケールの問題を論じてくださっているページだったが、
「LIKE でインデックスを使わせるには」という、まさに必要な情報を掲載してくださっていた。

以下引用文

普通にインデックスを作成してしまうと、LIKE 前方一致検索でインデックスが使われません。以下では、"SET enable_seqscan = off" 指定しているにも関わらず、他の選択肢が無いので Seq Scan を使ってしまっています。

<中略>

回避方法は、演算子クラス text_pattern_ops を指定することです



ということで、以下の様にtext_pattern_opsを使ってインデックスを作成すると、なんとインデックスが使われる様になった。

create index index_t_target on t (target text_pattern_ops);


なんともありがたい情報でした。

同じくexplain analyzeでindexが使われたことを確認し、かつcost(実行時間)が1/3くらいになった。
もっと速くなっても良さそうだったけど、まずは効果があり感激。

データベースは奥が深い。


スポンサーサイト
応援宜しくお願いします。ポチ↓↓
fC2ブログランキング にほんブログ村 グルメブログ 北海道食べ歩きへ 人気ブログランキングへ


| データベース | 02:12 | comments:0| trackbacks:0| TOP↑

COMMENT















非公開コメント

TRACKBACK URL

http://vmemo.blog36.fc2.com/tb.php/476-e8eb69d2

TRACKBACK

PREV | PAGE-SELECT | NEXT