sql-server – 对表的大改动有什么好处:每次DELETE和INSERT或UPDATE存在?

前端之家收集整理的这篇文章主要介绍了sql-server – 对表的大改动有什么好处:每次DELETE和INSERT或UPDATE存在?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在制作一个项目,我需要每天在一张桌子上更改大约36K记录.我想知道什么会更好:

>删除行并插入新行,或
>更新已存在的行

对我来说,删除所有行并插入新行更容易,但如果要将表和索引分段并影响性能,那么我希望尽可能进行更新,并在必要时删除/插入.

这将是一个夜间服务,我不打算提高过程本身的速度.我更关心对这个表的查询性能,我已经有8900万条记录以及这个夜间进程将如何影响它.

我应该删除/插入记录还是应该更新现有的记录(如果可能)?

解决方法

这实际上取决于有多少数据正在发生变化.可以说这张表有20列.而且你还有5个索引 – 每个索引都有差异.柱.

现在,如果所有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.

猜你在找的MsSQL相关文章