加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2021-01-10 10:27:03 所属栏目:MsSql教程 来源:网络整理
导读:我正在制作一个项目,我需要每天在一张桌子上更改大约36K记录.我想知道什么会更好: 删除行并插入新行,或 更新已存在的行 对我来说,删除所有行并插入新行更容易,但如果要将表和索引分段并影响性能,那么我希望尽可能进行更新,并在必要时删除/插入. 这将是一

我正在制作一个项目,我需要每天在一张桌子上更改大约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.

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读