[英]PostgreSQL Query Time
SELECT *
FROM vehicles t1
WHERE (SELECT COUNT(*) FROM vehicles t2
WHERE t1.pump_number = t2.pump_number
AND t1.updated_at < t2.updated_at
) < 4
AND t1.updated_at >= ?
我為參數提供'1970-01-01 00:00:00.000000'
?
。
我的vehicles
表中有大約1萬條記錄,沒有添加索引。 上面的查詢執行大約需要10-20秒。
如何優化它以減少執行時間?
Postgres提供了不錯的管理工具,該工具具有選項EXPLAIN來查看查詢執行計划。 它將提供深刻的見解。 這是pgadmin的詳細鏈接http://www.pgadmin.org/docs/1.4/query.html
還可以在查詢中使用聯接,而不是選擇聯接,這將提高查詢性能
試試這個(select和group by語句中的列需要用您自己的替換):
SELECT
t1.id,
t1.updated_at,
t1.other_columns
FROM vehicles t1
INNER JOIN vehicles t2
ON t1.pump_number = t2.pump_number
AND t1.updated_at < t2.updated_at
WHERE t1.updated_at >= '1970-01-01 00:00:00.000000'
GROUP BY
t1.id,
t1.updated_at,
t1.other_columns
having count(*)< 4
進行此更改后,您可以嘗試在Pump_number列上添加索引以查看是否有幫助。
這是您的查詢:
SELECT *
FROM vehicles t1
WHERE (SELECT Count(*)
FROM vehicles t2
WHERE t1.pump_number = t2.pump_number AND
t1.updated_at < t2.updated_at
) < 4 AND
t1.updated_at >= ? " , "1970-01-01 00:00:00.000000")]
我將從使用窗口函數編寫此代碼開始:
select v.*
from (select v.*, row_number() over (partition by pump_number order by updated_at) as seqnum
from vehicles v
) v
where v.seqnum < 4 and t1.updated_at >= ?;
對於此查詢,我建議在vehicles(pump_number, updted_at)
和vehicles(pump_number, updted_at)
vehicles(updated_at)
上建立索引。
要獲取等效查詢,請在此處使用窗口函數rank()
,而不是
: row_number()
SELECT *
FROM (
SELECT *
, rank() OVER (PARTITION BY pump_number ORDER BY updated_at DESC) AS rnk
FROM vehicles t1
) sub
WHERE rnk < 4
AND updated_at >= '1970-01-01 0:0';
並且必須為ORDER BY updated_at DESC
,以排除對於相同的pump_number
具有三個以上較舊對pump_number
。 換一種說法:
“獲取每三個最古老的行pump_number
-或更多,如果有關於關系updated_at
”。
無論如何,在您讀取大部分或全部表時,索引都無濟於事。
如果(pump_number, updated_at)
是唯一的或/並且vehicles
pump_number
不同值相對較少,則可能可以進一步優化。 您的問題中沒有足夠的信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.