【发布时间】:2022-01-14 08:19:15
【问题描述】:
我正在处理表中的 155+ 百万行并分批执行以提高性能,但遇到了列中的值未按预期更新的情况。我知道我可以通过几种不同的方式来解决它,但我想看看是否有人知道如何在单个更新语句中做到这一点。
下面是一个测试用例:
DECLARE @TempIds TABLE (
ColA int,
ColB int
)
--seed the values for a test
INSERT INTO @TempIds (ColA,ColB) VALUES (1, 2)
--do the update
UPDATE @TempIds SET ColA = (3+5), ColB = (1-ColA)
--see the results
SELECT * FROM @TempIds
上面的结果是:
ColA ColB
8 0
期望的结果是
ColA ColB
8 -7
更新语句在更新 ColB 时使用 ColA 的当前值为“1”,而不是使用 ColA 的最终值为“8”。
我知道我可以通过执行以下操作之一来解决此问题:
UPDATE @TempIds SET ColA = (3+5)
UPDATE @TempIds SET ColB = (1-ColA)
--see the results
SELECT * FROM @TempIds
OR
UPDATE @TempIds SET ColA = (3+5), ColB = 1-(3+5)
--see the results
SELECT * FROM @TempIds
以上任何一种都将导致以下输出:
ColA ColB
8 -7
这是一个简化版本,因为实际查询有很多计算和公式来计算 ColA 的值。
我试图避免两个更新语句或需要在 ColB 公式中重复 ColA 的公式。
提前致谢!
【问题讨论】:
-
我知道这可能是一个非常简单的例子。但是将
ColB设为计算列会解决您的问题吗? -
@Squirrel 在这种情况下,将其设置为计算列会导致性能问题,因为 ColB 也用于其他查询作为 where 子句的一部分。我的理解是这会导致性能问题,尤其是在查询大型表时。
-
计算列可以被持久化和索引,因此它可能不会达到您期望的性能。
标签: tsql