【问题标题】:Optimizing the below PgSQL query, though it serves the purpose but is very slow优化下面的 PgSQL 查询,虽然它可以达到目的,但速度很慢
【发布时间】:2021-08-19 19:40:01
【问题描述】:

在这里,我想检索表中已经存在的 ID 计数。比如我拉了一个15分钟的记录,所以想获取表中已经存在且不唯一的ID。

select count(*)
from "XYZ" a
where "StationName" in ('St_1','St_2') 
and "DateTime" between '2021-04-30 09:00:00.000' and '2021-05-03 09:15:59.999'
and "ID" in (select "ID" from "XYZ" b
                   where "StationName" in ('St_1','St_2')
                   and b."DateTime" < a."DateTime"
                  );

【问题讨论】:

  • 请描述您希望查询执行的操作。
  • 还提供包含缓冲区的执行盘
  • 感谢@GordonLinoff 格式化上面的代码,这里我想检索表中已经存在的 ID 计数。比如我拉了一个15分钟的记录,所以想获取表中已经存在且不唯一的ID。
  • 如果你只是用子查询删除多余的最终条件并在"DateTime"上添加索引呢?

标签: sql postgresql optimization query-optimization


【解决方案1】:

您似乎想要计算每个id 上出现在最后一个站点之前的所有“St_1”和“St_2”站点。如果是这样,我建议使用窗口函数:

select count(*)
from (select a.*,
             row_number() over (partition by id order by datetime desc) as seqnum
      from "XYZ" a
      where "StationName" in ('St_1', 'St_2') 
     ) a
where "DateTime" between '2021-04-30 09:00:00.000' and '2021-05-03 09:15:59.999' and
      seqnum > 1;

为此,我建议在(stationName, id, datetime) 上建立索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2018-11-16
    相关资源
    最近更新 更多