>删除行并插入新行,或
>更新已存在的行
对我来说,删除所有行并插入新行更容易,但如果要将表和索引分段并影响性能,那么我希望尽可能进行更新,并在必要时删除/插入.
这将是一个夜间服务,我不打算提高过程本身的速度.我更关心对这个表的查询性能,我已经有8900万条记录以及这个夜间进程将如何影响它.
我应该删除/插入记录还是应该更新现有的记录(如果可能)?
解决方法
现在,如果所有20列中的值都在改变,或者即使5列中的数据正在改变,并且这5列都已编入索引,那么您最好还是“删除并插入”.但是如果只有2列正在改变,并且假设这些列不是任何非聚集索引的一部分,那么你可能最好“更新”记录,因为在这种情况下只会更新聚簇索引(并且索引不必得到更新).
在进一步的研究中,我确实发现上面的评论有点多余,因为sql Server内部有两个独立的机制来执行UPDATE. – “就地更新”(即通过将列值更改为原始行中的新值)或“非就地更新”(DELETE后跟INSERT).
就地更新是规则,并在可能的情况下执行.这里的行在相同范围内完全保持在同一页面上的相同位置.只有受影响的字节是chnaged. tlog只有一条记录(前提是没有更新触发器).如果正在更新堆(并且页面上有足够的空间),则会发生更新.如果群集键发生更改但行根本不需要移动,则更新也会发生.
例如:如果您的姓氏上有聚集索引,并且您具有以下名称:
能够,贝克,查理
现在您要将Baker更新为Becker.不必移动任何行.所以这可以采取就地.然而,如果您必须将Able更新为Kumar,则必须移动行(即使它们将在同一页面上).在这种情况下,sql Server将执行DELETE,然后执行INSERT.
考虑到上述情况,我建议你做一个正常的UPDATE,让sql Server找出如何在内部完成它的最佳方法.
有关“更新”内部或任何sql Server相关内部的更多详细信息,请查看Kalen Delaney,Paul Randal等人的书 – SQL Server 2008 Internals.