sql-server - 使用多个更新或内部连接对性能更好
问题描述
我在触发器中使用了以下更新语句,它具有相同的行为,并且两者都是正确的,但是如果我同时更新 tableA_ID 和 ValueB,第二个就会出现问题。但这不是大问题,因为有解决方法,但如果可能的话,我想避免它。所以我想知道的是这两个之间有很大的表现,它会让我决定去哪一个。如果第二个性能比我使用第二个好得多。但是,如果差异不是那么大,我将使用第一个。我不是 sql server 方面的专家。任何人都可以帮忙吗?
UPDATE tableA
SET tableA.Value = tableA.Value - old.ValueB
FROM tableA
INNER JOIN (
SELECT tableA_ID ,ValueB
FROM deleted
) old ON old.tableA_ID = tableA.ID
UPDATE tableA
SET tableA.Value = tableA.Value + new.ValueB
FROM tableA
INNER JOIN (
SELECT tableA_ID ,ValueB
FROM inserted
) new ON new.tableA_ID = tableA.ID
UPDATE tableA
SET tableA.Value = tableA.Value - old.ValueB + new.ValueB
FROM tableA
INNER JOIN (
SELECT tableA_ID ,ValueB
FROM deleted
) old ON old.tableA_ID = tableA.ID
INNER JOIN (
SELECT tableA_ID ,ValueB
FROM inserted
) new ON new.tableA_ID = tableA.ID
解决方案
与任何事情一样,请对其进行测试以确定。
您是否应该在触发器中执行此操作是一个漫长的讨论。
在性能方面,在大多数情况下,第二个查询将获得更好的性能。我可以简单说明的原因是,您只在一次更新所有内容的查询中查看 UPDATE 的单个查找。然而,第一个查询必须两次找到要更新的数据。
但是,再次测试一下。
是的,正如@SMor 在评论中所说,绝对应该讨论为什么需要将其作为触发器。触发器可能会被严重误用和滥用。