在SELECT语句中使用参数时的性能问题

时间:2015-04-09 13:04:57

标签: sql-server performance view parameter-passing

我在查询时出现性能问题,我不知道为什么会发生这种情况。 此查询是通过存储过程调用的,但作为测试问题,问题是以两种执行方式(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

1 个答案:

答案 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;