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

Performance issue when using parameter in a SELECT statement

我在查询时遇到了性能问题,我不知道为什么会这样。 此查询是通过存储过程调用的,但作为测试,两种执行方式(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作为参数,所以我需要了解为什么需要这么长时间,并解决它。

有人有提示吗?

非常感谢!

埃利达

您将@coligada 作为局部变量而不是参数传递。因此,该值在编译时未知,因此 SQL 服务器使用平均密度统计来确定最佳计划。对于文字,该值在编译时已知,因此根据统计直方图中实际值的估计基数选择计划(假设列已编入索引)。

您可以尝试将查询参数化,如下例所示。您可以考虑向查询添加 OPTION(RECOMPILE) 提示以避免 "parameter sniffing" 问题:

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;