【问题标题】:Performance issue when using parameter in a SELECT statement在 SELECT 语句中使用参数时的性能问题
【发布时间】:2015-04-09 13:04:56
【问题描述】:

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

有人有提示吗?

非常感谢!

艾莉达

【问题讨论】:

    标签: sql-server performance view parameter-passing


    【解决方案1】:

    您将@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;
    

    【讨论】:

      猜你喜欢
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 2010-10-04
      • 2012-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多