sql - PostgreSQL MAX() 内部查询真的很慢

标签 sql postgresql greatest-n-per-group query-performance

我目前的任务是优化一些在非常大的数据集上运行的 SQL 查询。我有下面的查询,我正在尝试优化它,但目前正在努力解决它

查询大约需要 40-45 分钟才能返回答案,这显然是 Not Acceptable 。随着数据库中数据集的增长,它甚至需要更长的时间。

我认为是内部 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');

非常感谢!

最佳答案

这种语句可以使用 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) 上的索引可能会有所帮助

关于sql - PostgreSQL MAX() 内部查询真的很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35270123/

相关文章:

sql - 如何将Presto `ST_Distance`的结果转换为米?

sql - 增量 DISTINCT/GROUP BY 操作

mysql - 为 "Order By"整数数据创建排名 - MySQL

mysql - 计算唯一电子邮件中的域数量

sql - sql存储函数给出错误

postgresql - 当另一列具有特定值时对一列进行 NOT NULL 约束

mysql - INITCAP() 的相反函数

sql - PostgreSQL 9.0 和 9.1 枚举类型字面量排序的区别

mysql - 获取每个 game_index 的前 3 个条目

sql - 仅当记录具有特定标签时才获取记录