SQL Server查询需要很长时间才能执行



我有以下查询。当前执行5838行的结果需要5.5个小时。如果我去掉时间戳限制,只针对视图的所有结果运行它,那么整个过程将在不到2分钟的时间内运行。

当我试图限制时间/日期范围时,我正在寻找一种方法来加快执行速度,并愿意接受任何建议。如果需要,我可以详细介绍数据集。

SELECT
m.rpp
,m.SourceName
,m.ckt AS l_ckt
,m.amp AS l_amp 
,MAX(m.reading) AS l_reading
,k.ckt AS r_ckt
,k.amp AS r_amp
,MAX(k.reading) AS r_reading
FROM 
vRPPPanelLeft m 
INNER JOIN 
vRPPPanelRight k ON (m.sourcename = k.sourcename) 
AND (CAST(m.ckt AS int) + 1 = CAST(k.ckt AS int))
WHERE
m.timestampserverlocal BETWEEN '2020-10-10' AND '2020-10-12' 
AND k.timestampserverlocal BETWEEN '2020-10-10' AND '2020-10-11'
GROUP BY
m.rpp, m.sourcename, m.ckt, m.amp, k.ckt, k.amp

我假设m和k是视图,并且可能是相当复杂的视图和/或具有GROUP BY语句。

我猜,当您查看执行计划和/或统计信息时,它实际上会多次运行其中至少一个视图,例如,另一个视图中的每一行都运行一个视图。

快速修复

如果你能够(例如,它在一个存储过程中(,我建议以下过程

  • 创建具有与m和k相同结构的临时表(或具有用于此目的的相关列(。包括ckt的修改版本的列(例如,两者的int(。考虑两个临时表的sourcename和ckt(int(的PK(或至少是聚集索引(,这可能有帮助,也可能没有帮助
  • 独立运行m和k视图,将结果存储在这些临时表中。使用筛选(例如,时间戳服务器本地上的WHERE子句(和潜在的相关GROUP BY子句来减少创建的行数
  • 运行原始SQL,但使用临时表而不是视图,并且不需要WHERE子句。它可能仍然需要GROUP BY

更长的修复

我建议先进行快速修复,以确认多次运行的视图是问题所在。

如果是这样(问题是视图被多次运行(,一个更长的解决方案是停止在FROM中使用视图,而是将所有视图放在一个查询中,然后尝试简化代码。

最新更新