簡體   English   中英

Postgres慢速限制查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM