Ecl*_*pse 5 sql-server-2005 best-practices
我正在使用 SQL Server 2005。我有一个表,它基本上是一个带有时间戳的 id 列表,用于记录该 id 上次发生事件的时间。
我有一个表变量中的 id 列表,我想用当前时间更新表中所有已经在表中的 id,并为尚未在表中的 id 插入新记录。SQL 2005 没有 MERGE 语句或 ON DUPLICATE KEY UPDATE。
以下哪种形式是首选:
UPDATE IdTimes SET LastEventTime = GetDate() WHERE Id in (SELECT NewId FROM @NewIds)
INSERT INTO IdTimes(Id, LastEventTime)
SELECT NewId, GetDate() FROM @NewIds
WHERE NOT EXISTS (SELECT Id FROM IdTimes WHERE NewId = Id)
Run Code Online (Sandbox Code Playgroud)
或者:
DELETE FROM IdTimes WHERE Id IN (SELECT NewId FROM @NewIds)
INSERT INTO IdTimes(Id, LastEventTime) SELECT NewId, GetDate() FROM @NewIds
Run Code Online (Sandbox Code Playgroud)
或者是否有更好的解决方案来实现这一目标?
gbn*_*gbn 11
通常更新然后插入。简单地说,它的工作量更少。
在这种情况下,您有一个 ID 列 (IDENTITY):我假设这是聚集索引
您删除行,在页面中留下空白 = 碎片。您添加行,您可能需要分配更多的页面。其他进程也在这样做。
UPDATE 将在原位更新,因为行较少,所以 INSERT 的成本会更低。
这么说...
如果你的 new:update 是 100:1 那么它当然并不重要。并且 EXISTS 也是必需的。
但是,从原始“移动数据”的角度来看,UPDATE..INSERT 将是我的选择