gpt4 book ai didi

sql - IF NOT EXISTS vs @@ROWCOUNT - 性能

转载 作者:行者123 更新时间:2023-12-01 09:56:46 25 4
gpt4 key购买 nike

我应该使用哪一种以获得最佳性能?

这个:

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 所做的是同时执行 INSERTUPDATE .从 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com