[英]Postgres slow limit query
我在pg中有這個簡單的查詢
EXPLAIN ANALYZE
select * from email_events
where act_owner_id = 500
order by date desc
limit 500
第一次查詢執行需要很長時間,大約需要7秒。
"Limit (cost=0.43..8792.83 rows=500 width=2311) (actual time=3.064..7282.497 rows=500 loops=1)"
" -> Index Scan Backward using email_events_idx_date on email_events (cost=0.43..233667.36 rows=13288 width=2311) (actual time=3.059..7282.094 rows=500 loops=1)"
" Filter: (act_owner_id = 500)"
" Rows Removed by Filter: 1053020"
"Total runtime: 7282.818 ms"
在第一次執行之后,我猜查詢將被緩存並在20-30毫秒內執行。
當沒有緩存時,為什么LIMIT這么慢? 我怎樣才能解決這個問題?
INDEX上的CLUSTER TABLE似乎可以解決此問題。 看來,在批量加載數據之后,數據遍布整個硬盤驅動器。 CLUSTER表將對硬盤上的數據重新排序
PostgreSQL認為向后掃描按日期排序的索引(即按DESC
順序),讀取每一行並丟棄沒有正確的act_owner_id
的行會act_owner_id
。 為此,必須執行1053020隨機讀取,並且向后索引掃描也不是很快。
嘗試在email_events(date DESC, act_owner_id)
上創建索引。 我認為 Pg將能夠對此進行正向索引掃描,然后使用第二個索引項來過濾行,因此它不必進行堆查找。 用EXPLAIN
測試並查看。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.