私は200kタプルのようなものでPostgresqlテーブルを持っています。 私は何をしようとすると、いくつかの行をフィルタリングして、フルテキストのマッチングを使用してそれらを注文です:Postgresql - ソートされたセットの全文オーダー
SELECT * FROM descriptions as d
WHERE d.category_id = ?
AND d.description != ''
AND regexp_replace(d.description, '(...)', '') !~* '...'
AND regexp_replace(d.description, '...', '') !~* '...'
AND d.id != ?
ORDER BY ts_rank_cd(to_tsvector('english', name), plainto_tsquery('english', 'my search words')) DESC LIMIT 5 OFFSET 0';
説明フィールド上GINインデックスがあります。
このクエリは、4000未満のレコードがある場合にのみ有効です。その5kまたは6kのように多くの場合、クエリは非常に遅くなります。
私はこのクエリのさまざまなバリエーションを試していました。私が気づいたのは、WHERE句かORDER BY句のどちらかを削除してからスピードアップしたときです。 (もちろん無関係な結果が出る)
この組み合わせを高速化するにはどうすればよいですか?最適化の方法やPostgreSQL以外のソリューションを探すべきですか?
追加質問:
私はさらに実験だし、例えばこれは私が実行が遅すぎると思う最も簡単なクエリです。私は説明から、要点インデックスを使用しているときと、そうでないときを分析することはできますか?
SELECT d.*, d.description <-> 'banana' as dist FROM descriptions as d ORDER BY dist DESC LIMIT 5
"Limit (cost=16046.88..16046.89 rows=5 width=2425) (actual time=998.811..998.813 rows=5 loops=1)"
" -> Sort (cost=16046.88..16561.90 rows=206010 width=2425) (actual time=998.810..998.810 rows=5 loops=1)"
" Sort Key: (((description)::text <-> 'banana'::text))"
" Sort Method: top-N heapsort Memory: 27kB"
" -> Seq Scan on products d (cost=0.00..12625.12 rows=206010 width=2425) (actual time=0.033..901.260 rows=206010 loops=1)"
"Total runtime: 998.866 ms"`
回答(kgrittnは):DESCキーワードは、KNN-GiSTのために正しいものではなく、それが実際にここに望んでいたではないです。それを削除すると、問題が修正され、正しい結果が得られます。
インデックスはありますか?クエリプランナーはあなたに何を伝えますか? –
私はジーンと要点の指標を試していますが、使用されていないかのように見えます。どのようにプランナーが私に言うかを確認するには?あなたが意味することを説明しますか? – Lubiluk