PostgreSQL MAX() 内部查询真的很慢
PostgreSQL MAX() inner query really slow
我目前的任务是优化一些 SQL 查询,这些查询在非常大的数据集上 运行。我有下面的查询,我正在尝试优化它,但目前正在努力解决它
查询大约需要 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');
非常感谢!
我建议 window 函数:
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;
这种语句可以使用 Postgres 的 distinct on()
运算符完成(通常比使用标准 window 函数的等效解决方案更快):
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)
上的索引可能会有所帮助
我目前的任务是优化一些 SQL 查询,这些查询在非常大的数据集上 运行。我有下面的查询,我正在尝试优化它,但目前正在努力解决它
查询大约需要 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');
非常感谢!
我建议 window 函数:
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;
这种语句可以使用 Postgres 的 distinct on()
运算符完成(通常比使用标准 window 函数的等效解决方案更快):
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)
上的索引可能会有所帮助