使用变量会导致更新运行速度非常慢

时间:2012-06-04 18:49:20

标签: tsql

我有以下查询。

  UPDATE t
  SET    UnitsSold = sub.UnitsSold,
  FROM   dbo.table1 t
         JOIN (SELECT s.CustomerKey,
                      s.WeekKey,
                      s.ProductKey,
                      Sum(s.UnitsSold)          AS [UnitsSold],
               FROM   dbo.table2 s
               WHERE  WeekKey >= 335
               GROUP  BY s.WeekKey,
                         s.CustomerKey,
                         s.ProductKey) AS sub
           ON sub.WeekKey = t.WeekKey
              AND sub.CustomerKey = t.CustomerKey
              AND sub.ProductKey = t.ProductKey

它像冠军一样奔跑。大约2秒钟。然后尝试通过以下方式使其动态化。

      DECLARE @StartWeekKey AS INT 
        SET @StartWeekKey = 335

  UPDATE t
  SET    UnitsSold = sub.UnitsSold,
  FROM   dbo.table1 t
         JOIN (SELECT s.CustomerKey,
                      s.WeekKey,
                      s.ProductKey,
                      Sum(s.UnitsSold)          AS [UnitsSold],
               FROM   dbo.table2 s
               WHERE  WeekKey >= @StartWeekKey
               GROUP  BY s.WeekKey,
                         s.CustomerKey,
                         s.ProductKey) AS sub
           ON sub.WeekKey = t.WeekKey
              AND sub.CustomerKey = t.CustomerKey
              AND sub.ProductKey = t.ProductKey

突然间,它超级慢了。

有什么好主意吗?

编辑: Probalby应该提到这一点,但这包含在存储过程中。

将@StartWeekKey添加为proc的参数,并在几秒钟内恢复运行。

2 个答案:

答案 0 :(得分:1)

此问题之前似乎已多次提出,一般的答案是它与统计数据有关。

尝试:

UPDATE STATISTICS table_or_indexed_view_name

让您的统计信息保持最新状态,看看是否有所作为。

答案 1 :(得分:0)

当不同的参数具有非常不同的分布时,这并不是闻所未闻,因此不同的好计划。可能发生的情况是查询是针对给定值执行的,然后该计划被缓存并不恰当地重新使用以获得不同的值。

如果是这种情况(只是猜测 - 我无法运行您的查询来检查!)然后尝试添加:

OPTION (OPTIMIZE FOR (@StartWeekKey UNKNOWN))

到查询结尾。


另一个想法:WeekKey实际上是int吗?这是某种质量类型转换问题吗?


我无法检查这些;如果我离赛道很远,请告诉我,这样我就可以删除一个无用的答案。