在 SQL Server 中删除然后插入还是更新然后插入更好?

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 将是我的选择