我在查询时出现性能问题,我不知道为什么会发生这种情况。 此查询是通过存储过程调用的,但作为测试问题,问题是以两种执行方式(T-SQL或St. Proc)发生的。 我正在VIEW上执行SELECT语句,使用参数来定义结果集。参数@coligada表示附属公司ID。 它是这样的:
DECLARE @coligada INT
SET @coligada = 1
SELECT id1, id2, code1, code2, code3, date, value1, name1, name2
FROM view_financialcube
WHERE
coligada = @coligada
AND date >= DATEADD(d,1,dbo.function_LastWorkingDay('01/01/2014'))
AND date <= DATEADD(m,1,'01/01/2014')
AND userid = 'elida'
因此,当我执行时,查询会持续几分钟(当它达到10分钟时我没等待结束......)
然后,我尝试了相同的查询,这次没有通过coligada作为参数:
SELECT id1, id2, code1, code2, code3, date, value1, name1, name2
FROM view_financialcube
WHERE
coligada = 1
AND date >= DATEADD(d,1,dbo.function_LastWorkingDay('01/01/2014'))
AND date <= DATEADD(m,1,'01/01/2014')
AND userid = 'elida'
这个例子只用了5秒钟就完成了。
因为根据coligada作为参数在不同情况下调用此语句,我需要理解为什么需要这么长时间并解决它。
有人有提示吗?
非常感谢你!
ELIDA
答案 0 :(得分:0)
您将@coligada作为局部变量传递,而不是参数。因此,在编译时不知道该值,因此SQL Server使用平均密度统计信息来确定最佳计划。使用文字,该值在编译时已知,因此根据统计直方图中实际值的估计基数来选择计划(假设列已编制索引)。
您可以尝试参数化查询,如下例所示。您可以考虑在查询中添加OPTION(RECOMPILE)
提示,以避免“参数嗅探”问题:
DECLARE @coligada INT;
SET @coligada = 1;
EXEC sp_executesql
N'SELECT id1, id2, code1, code2, code3, date, value1, name1, name2
FROM view_financialcube
WHERE
coligada = @coligada
AND date >= DATEADD(d,1,dbo.function_LastWorkingDay(''20140101''))
AND date <= DATEADD(m,1,''20140101'')
AND userid = ''elida'';',
N'@coligada int'
,@coligada = @coligada;