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