2016-02-08 89 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子句)。 –