【发布时间】:2011-07-13 17:45:29
【问题描述】:
我有以下查询,我想知道 CASE 构造有多糟糕,当 E.EAOpID 不为空时,它会强制 DB 引擎用 E.EAOpID 中已包含的值覆盖 E.EAOpID
UPDATE E
SET E.EAOpID = CASE
WHEN E.EAOpID IS NULL THEN @operationID
ELSE E.EAOpID
END,
E.AverageCapacity = E.AverageCapacity + 1,
E.Average = E.Average - (E.Average - E.Value) / E.AverageCapacity
FROM
(
SELECT E.EAOpID, E.AverageCapacity, E.Average, P.Value
FROM Probes AS P
INNER JOIN Estimates AS E ON P.EstimateID = E.ID
WHERE P.EAOpID = @operationID
) AS E;
也许将这个更新分成两个更新更便宜:
1
UPDATE E
SET E.EAOpID = @operationID
FROM
(
SELECT E.EAOpID, E.AverageCapacity, E.Average, P.Value
FROM Probes AS P
INNER JOIN Estimates AS E ON P.EstimateID = E.ID
WHERE P.EAOpID = @operationID
AND E.EAOpID IS NULL -- Additional statement here
) AS E;
2
UPDATE E
SET E.AverageCapacity = E.AverageCapacity + 1,
E.Average = E.Average - (E.Average - E.Value) / E.AverageCapacity
FROM
(
SELECT E.EAOpID, E.AverageCapacity, E.Average, P.Value
FROM Probes AS P
INNER JOIN Estimates AS E ON P.EstimateID = E.ID
WHERE P.EAOpID = @operationID
) AS E;
【问题讨论】:
-
这张表上的索引是什么样的?
-
你为什么不使用 Profiler 测量每个的性能。这确实是确定您的查询性能以及将完成多少次读取/写入的唯一方法。
-
好的,我明白了,谢谢(目前没有索引,但是添加索引没问题,我担心理论问题)
-
除了 Randy 关于测试的观点,我想你会发现在很多情况下(除非有很多索引引用该列),检查值是否不同将是至少与不检查就覆盖它一样昂贵 - 特别是如果你最终不得不在大量实例中覆盖它。
-
关于“检查值是否不同”这不是关于速度,而是关于查询的逻辑,我需要检查它,因为我不希望它只在不同的情况下改变
标签: sql sql-server sql-server-2008 sql-optimization