motoi sugito
m.sug****@gmail*****
2008年 4月 8日 (火) 18:16:24 JST
はじめまして、杉藤と申します。 Ludiaについて質問させてください。よろしくお願い致します。 【概要】 Ludiaを使って全文検索を実行し、且つその結果をソートして 表示したいのですが、どうしても処理結果が返るのに10秒以上 掛かってしまいます。 検索結果を一瞬(せめて3秒以内)で返るようにしたいのですが、 何かよい方法はございませんでしょうか? 【環境】 O S : CentOS5.1 D B : PostgreSQL 8.3.1 Ludia : 1.5.0 (mecab-0.97 ipadic-2.7.0 senna-1.1.2) 【詳細】 ◆以下の構造のテーブルがあり、400万件データを保持してます テーブル名:item colmun | type ------------------------ title | varchar(512) price | integer descr | text : : ◆このテーブルには以下のインデックスを設定してます。 "idx_item_descr" fulltext (descr) "idx_item_price" btree (price) ◆このテーブルに対して次のようなSelect文を投げます。 すると結果が返るのに10秒以上掛かってしまいます。 SELECT price, title FROM item WHERE descr %% '価格' ORDER BY price LIMIT 5 OFFSET 10; 【自分なりの調査結果】 ◆1.通常の全文検索のみの場合では、処理結果が返るのが早いです。 # explain SELECT price, title FROM item WHERE descr %% '価格' LIMIT 5 OFFSET 10; QUERY PLAN ---------------------------------------------------------------------------- Limit(cost=11.40..16.98 rows=5 width=94) ->Index Scan using idx_item_descr on item(cost=0.25..1029.75 rows=923 width=94) Index Cond: (descr %% '価格'::text) ◆2.通常のORDER BYのみの場合でも、処理結果が返るのが早いです。 # explain SELECT price, title FROM item ORDER BY price LIMIT 5 OFFSET 10; QUERY PLAN ----------------------------------------------------------------------------- Limit(cost=9.69..14.53 rows=5 width=94) ->Index Scan using idx_item_price on item(cost=0.00..893871.38 rows=922639 width=94) ※この場合、ORDER BYの指定カラム「price」にBtree インデックスが設定されているのでソート処理が走ら ないので高速に結果が返ってます。 ◆3.ところが1と2が組み合わさると遅くなってしまいます。 # explain SELECT price, title FROM item WHERE descr %% '価格' ORDER BY price LIMIT 5 OFFSET 10; QUERY PLAN ----------------------------------------------------------------------------- Limit(cost=1052.42..1052.43 rows=5 width=94) ->Sort(cost=1052.40..1054.70 rows=923 width=94) Sort Key: price ->Index Scan using idx_item_descr on item(cost=0.25..1029.75 rows=923 width=94) Index Cond: (descr %% '価格'::text) ※(2.の時に)走らなかったsortが走ってしまい。ここに大変時間が掛 かってしまいます。enable_sortをoffにしても解決できませんでした。 以上です。解決策をご存知の方がおりましたら、教えていただきたく 何卒よろしくお願い致します。