SQL Server - DECLARE SET 的执行时间比硬编码 where 条件中的参数要花费太多时间

问题描述 投票:0回答:2

我有一个简单的 CTE 选择语句,其中我在 WITH 之前声明并设置了值,并且我正在获取一天的数据,该数据将有近 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'

实际上数据库有一个带有长查询的SP,这里我只提供了第一个CTE表,并且相同类型的表条件适用于我的其余CTE表。如果我找到了这种缓慢的线索,我会修复其余的查询。

sql-server performance common-table-expression declare
2个回答
0
投票

很可能与传递到查询中的变量相关的错误查询计划。 Sql Server 使用存在的参数为使用不同变量集的类似查询获取不同的查询计划。您可以更新统计应用程序,或者正如其他评论者所说,在查询末尾添加选项(重新编译)以强制数据库考虑新计划。


-2
投票

由于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 

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

© www.soinside.com 2019 - 2024. All rights reserved.