我有以下查询。
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的参数,并在几秒钟内恢复运行。
答案 0 :(得分:1)
此问题之前似乎已多次提出,一般的答案是它与统计数据有关。
尝试:
UPDATE STATISTICS table_or_indexed_view_name
让您的统计信息保持最新状态,看看是否有所作为。
答案 1 :(得分:0)
当不同的参数具有非常不同的分布时,这并不是闻所未闻,因此不同的好计划。可能发生的情况是查询是针对给定值执行的,然后该计划被缓存并不恰当地重新使用以获得不同的值。
如果是这种情况(只是猜测 - 我无法运行您的查询来检查!)然后尝试添加:
OPTION (OPTIMIZE FOR (@StartWeekKey UNKNOWN))
到查询结尾。
另一个想法:WeekKey
实际上是int
吗?这是某种质量类型转换问题吗?
我无法检查这些;如果我离赛道很远,请告诉我,这样我就可以删除一个无用的答案。