我有一個像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):對於KNN-GiST,DESC關鍵字不正確,實際上不需要這裏。刪除它可以解決問題並提供正確的結果。
你有什麼指數?查詢計劃者告訴你什麼? – 2012-05-07 16:16:39
我做了杜松子酒和主要指標的實驗,但看起來他們沒有使用或什麼。如何看看規劃師告訴我什麼?解釋你的意思? – Lubiluk