我应该使用哪一种以获得最佳性能?
这个:
IF NOT EXISTS (...where Id = 'x')
INSERT...'x'
ELSE
UPDATE...WHERE Id = 'x'
或者这个:
UPDATE...WHERE Id = 'x'
if @@ROWCOUNT = 0
INSERT...'x'
最佳答案
我认为您提出的两个版本之间的性能无关紧要。
对我来说,真正的问题是如何处理语句之间的数据库事件。如果有人尝试在第一个示例中的 NOT EXISTS 检查或第二个示例中的 UPDATE 之后立即插入一行,会发生什么情况?这是在交易中发生的吗?如果是这样,您的隔离级别是多少?MERGE
会更好,但你说这不是一个选项,因为你需要支持 SQL Server 2005。
我们为 SQL Server 2005 所做的是同时执行 INSERT
和 UPDATE
.从 UPDATE
开始,所以你不要UPDATE
您刚刚使用 INSERT
创建的行:
UPDATE Persons
SET PersonName = 'Ted'
WHERE PersonID = 6
;WITH Data(Id, Name)
AS (SELECT 6, 'Ted')
INSERT MyTable (PersonId, PersonName)
SELECT Id, Name
FROM Data
LEFT JOIN Persons ON PersonId = Id
WHERE PersonId IS NULL -- the person does not already exist
此例程对于较大的批量操作更有意义,其中一些数据可能已经存在,但它可以用于单个更新。
另一个考虑因素:您是否需要跟踪其他人是否更改了行?如果是这样,我建议添加
timestamp
(在较新版本中为 rowversion
)列并且失败了 UPDATE
如果时间戳不同。例如,假设 Alice 正在编辑名为“Bill”的个人 ID 6。在打开 Bill 的行后,Charlie 打开 Bill 的行,输入一些信息并保存更改。当 Alice 保存她的更改时,她将覆盖 Charlie 的更改。
关于sql - IF NOT EXISTS vs @@ROWCOUNT - 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24963750/