我的第一个问题是建议删除和插入还是简单地运行更新。哪一个计算量较小?
更新比删除和插入便宜。原因是瓶颈是磁盘(不是计算)。插入和删除在磁盘上的一个页面中分配和释放字节,并且可能需要更新一个或两个索引。更新会将它们留在原处,并且只会更改几个字节,因此 IO 会更少。最重要的是,插入和删除是两个操作(+这会影响的任何索引),而只有一个用于更新。(顺便说一句,日志记录会产生更多开销)
如果您使用的是 sql2008 或更高版本,则可以使用表值参数,这些对于您所描述的内容应该非常有效,因为您可以在一次往返中将整个更新集发送到 sql。如果您使用常规更新语句,则需要运行 46 条语句。
如果您真的想调整它,您可能还想考虑将 TVP 与合并语句结合起来,以在单个操作中处理更新和插入的混合。
话虽如此,您可能只想使用代码中最简单的方法。如果您没有性能问题,则不必修复它。
其次,我要确保所有会话数据都已提交,即如果我发送 46 行数据,我要确保它们已写入。在删除/插入场景中,删除可能会继续,而插入可能会失败。
您确实可以使用事务,用于更新或删除/插入。
begin tran
delete * from table where some condition
insert into table (value1, value 2) values (1, 2), (3, 4) ..
commit tran
这将作为一个整体成功或不更改数据库。这也适用于使用 table value 参数。