2016-11-13 16 views
1

GINインデックスの何が問題なのですが、SEQスキャンを回避できませんか?

create table mytable(hash char(40), title varchar(500)); 
create index name_fts on mytable using gin(to_tsvector('english', 'title')); 
CREATE UNIQUE INDEX md5_uniq_idx ON mytable(hash); 

私はタイトルを照会私はこのような表を作成しました

test=# explain analyze select * from mytable where to_tsvector('english', title) @@ 'abc | def'::tsquery limit 10; 
                QUERY PLAN 
-------------------------------------------------------------------------------------------------------------------- 
Limit (cost=0.00..277.35 rows=10 width=83) (actual time=0.111..75.549 rows=10 loops=1) 
    -> Seq Scan on mytable (cost=0.00..381187.45 rows=13744 width=83) (actual time=0.110..75.546 rows=10 loops=1) 
     Filter: (to_tsvector('english'::regconfig, (title)::text) @@ '''abc'' | ''def'''::tsquery) 
     Rows Removed by Filter: 10221 
Planning time: 0.176 ms 
Execution time: 75.564 ms 
(6 rows) 

インデックスが使用されていません。何か案は?私は10mの行を持っています。あなたのインデックス定義にタイプミスがあり

+0

これは、フルテキスト検索の仕組みではありません。 – Phill

+0

@Phillあなたは精緻化できますか? – daisy

+0

クエリは実行時の値を変換しますが、これは遅くなりますが、インデックスは使用されません。テーブルの別の列にtsvectorを格納する必要があります。 – Phill

答えて

1

、それはあなたがそれを書いた方法

ON mytable USING gin (to_tsvector('english', title)) 

代わりの

ON mytable USING gin (to_tsvector('english', 'title')) 

する必要があり、それは、定数ではなくインデックス付けされたフィールドでありますそのようなインデックスは、実際にあなたが実行するような検索には役に立たないでしょう。

インデックス使用することができれば、あなたは

SET enable_seqscan=off; 

を実行し、再度クエリを実行することができます参照してください。
インデックスがまだ使用されていない場合、インデックスはおそらく使用できません。

上記に加えて、あなたの実行計画に奇妙なものがあります。 PostgreSQLは、mytableのシーケンシャルスキャンでは、あなたが言う通り、13744行で1000万ではないと推定しています。自動バキュームを無効にしましたか、テーブルの統計情報が不正確になる可能性がありますか?

+0

タイポが修正されたあとでも、「制限10」によってインデックスの使用が妨げられていました。 – daisy

関連する問題