2016-02-08 101 views
1

我目前的任務是優化一些運行在非常大的數據集上的SQL查詢。我有下面的查詢,我試圖優化,但在此刻掙扎PostgreSQL MAX()內部查詢真的很慢

該查詢大約需要大約40-45分鐘回覆,顯然不可接受的答案。隨着數據集在數據庫中的增長,它甚至需要更長的時間。

我相信它的內部MAX()函數大大減緩查詢?

我感謝任何幫助或建議,使查詢更好,更快。

SELECT 
    positionview.equipmenttimestamp, 
    positionview.name, 
    positionview.iNumber, 
    positionview.datauserprovidername, 
    positionview.latitude, 
    positionview.longitude 
FROM 
    public.positionview 
WHERE positionview.outbound = false 
AND positionview.referenceIdentifier is null 
AND positionview.responseType = 'XYZ' 
AND positionview.equipmentTimestamp >='2016-02-02 14:44:08.213' 
AND positionview.equipmentTimestamp <='2016-02-05 14:44:08.213' 
AND positionview.equipmentTimestamp =(
    SELECT MAX(positionview2.equipmentTimestamp) 
    FROM PositionView positionview2 
    WHERE positionview.iNumber = positionview2.iNumber 
    AND positionview2.outbound = false 
    AND positionview2.referenceIdentifier is null 
    AND positionview2.responseType = 'XYZ' 
    AND positionview2.equipmentTimestamp >='2016-02-02 14:44:08.213' 
    AND positionview2.equipmentTimestamp <='2016-02-05 14:44:08.213'); 

非常感謝提前!

回答

2

這樣的說法可以使用Postgres的distinct on()運營商(通常是比使用標準窗口功能等效的解決方案快)來完成:

SELECT distinct on (inumber) 
    equipmenttimestamp, 
    name, 
    iNumber, 
    datauserprovidername, 
    latitude, 
    longitude 
FROM 
    public.positionview 
WHERE outbound = false 
AND referenceIdentifier is null 
AND responseType = 'XYZ' 
AND equipmentTimestamp >='2016-02-02 14:44:08.213' 
AND equipmentTimestamp <='2016-02-05 14:44:08.213' 
order by inumber, equipmentTimestamp desc; 

(inumber,equipmenttimestamp)上的索引可能會幫助

+0

令人驚歎!謝謝和其他花時間提交答案的人。非常感謝! – dnzdlklc

1

我建議窗口功能:

SELECT pv.* 
FROM (SELECT pv.*, MAX(pv.equipmenttimestamp) OVER (PARTITION BY pv.inumber) as maxet 
     FROM public.positionview pv 
     WHERE pv.outbound = false AND 
      pv.referenceIdentifier is null AND 
      pv.responseType = 'XYZ' AND 
      pv.equipmentTimestamp >='2016-02-02 14:44:08.213' AND 
      pv.equipmentTimestamp <='2016-02-05 14:44:08.213' 
    ) pv 
WHERE equipmenttimestamp = maxet; 
+0

@a_horse_with_no_name。 。 。這是一個糟糕的監督(實際上,我提交得太早,甚至沒有where子句)。 –