我有一个简单的CTE select语句,其中在WITH之前声明了和SET的值,并且一天要获取数据,这将有近200,000行数据。如果执行该查询,则会花费更多时间(10分钟内未完成)。但是,如果我删除那些DECLARE,SET并在WHERE条件下对这些输入值进行了硬编码,结果将显示在15秒内。

该表具有将近3.5亿行数据,并且带有正确索引的主键列。

这种缓慢的可能性是什么?

实际查询

DECLARE @StartTime DATETIME
DECLARE @EndTime DATETIME
DECLARE @ApplicationName VARCHAR(100)
SET @StartTime = '2018-12-10'
SET @EndTime = '2018-12-10'
SET @Applicationname = 'APPNAME'

;WITH TOTAL as (
SELECT * FROM TABLE WHERE DATETIME >= + @StartTime + '00:00:01' AND
DATETIME <= + @EndTime + '23:59:59'
AND APPLICATIONID=(SELECT APPLICATIONID FROM APPLICATION WHERE ApplicationName=@Applicationname
)
SELECT * FROM TOTAL


变更后

SELECT * FROM TABLE WHERE DATETIME >= '2018-12-10 00:00:01' AND
DATETIME <= '2018-12-10 23:59:59'
AND APPLICATIONID=(SELECT APPLICATIONID FROM APPLICATION WHERE ApplicationName='APPNAME'


实际上,数据库具有带有Long查询的SP,在这里,我仅提供了第一个CTE表,并且提供了适用于其余CTE表的相同类型的表条件。如果我对这种缓慢情况有所了解,我将修复其余的查询。

最佳答案

由于SQL Server必须为TABLE上的每个记录编译变量StartTime和EndTime进行过滤,因此它花费的时间更长。如果您执行以下操作:

DECLARE @StartTime DATETIME
DECLARE @EndTime DATETIME
DECLARE @ApplicationName VARCHAR(100)
SET @StartTime = '2018-12-10 00:00:01'
SET @EndTime = '2018-12-10 23:59:59'
SET @Applicationname = 'APPNAME'

SELECT *
FROM TABLE
WHERE DATETIME >= @StartTime AND DATETIME <= @EndTime
AND APPLICATIONID=(SELECT APPLICATIONID FROM APPLICATION WHERE
ApplicationName=@Applicationname


这样,您可以减少过滤时的负载并预先计算所需的固定变量。

关于sql-server - SQL Server-DECLARE SET执行时间比在where条件下对参数进行硬编码要花太多时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53755146/

10-15 00:03
查看更多