首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >newid()与newsequentialid()有什么区别/优缺点?

newid()与newsequentialid()有什么区别/优缺点?
EN

Stack Overflow用户
提问于 2009-10-19 06:08:45
回答 4查看 24.7K关注 0票数 32

在所有主键都是GUID的数据库中,使用newid()和newsequentialid()作为“默认值或绑定”有什么区别/暗示和/或优缺点。

我所知道的唯一区别是newid()创建一个新的随机GUID,而不是newsequentialid()根据表中最后一个GUID以递增的方式创建一个新的GUID。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-10-19 06:14:44

当您在DB行中执行insert操作时,它将按照相对于表中其他主键的顺序插入。使用普通的guid,它可以在表中的任何位置。新的newsequentialid()将始终添加到表的末尾。

从而提高了刀片的性能。

This site解释了这两种不同方法之间的差异和基准。

更新-引用的博客帖子已被移动。该链接现在引用web.archive.org链接。这里是关键的外卖:

最引人注目的是NEWID系统函数所需的写入次数。这一点,再加上69%的平均页面密度,是叶级插入的随机分布所导致的页面拆分的证据。页面填满后,需要将其拆分为两页,每页占50%才能完成插入。页面拆分不仅导致页面密度较低,而且使数据页面碎片化得非常严重(有99%的概率下一个数据页面不在当前数据页面的旁边)。在我们的测试中,页面拆分所需的空闲页面最有可能的位置是在表的末尾,而与插入行的位置无关。因此,为了按顺序读取行,扫描需要在广泛分布的拆分页面之间来回跳转,因此出现了令人震惊的碎片。

--斯特凡·德尔马科

票数 33
EN

Stack Overflow用户

发布于 2013-09-09 23:45:45

关于顺序密钥(如identity、sequential )与非顺序密钥(如NEWID或自定义随机密钥生成器)的使用,有几个方面需要考虑。

从连续键开始,所有行都进入索引的右端。当页已满时,SQL Server将分配一个新页并填充该页。这会减少索引中的碎片,从而有利于提高读取性能。此外,当单个会话正在加载数据,并且数据驻留在单个驱动器或少量驱动器上时,插入速度会更快。

但是,对于具有多个磁盘轴的高端存储子系统,情况可能会有所不同。当从多个会话加载数据时,您最终将与索引叶级链表的最右侧页争用页闩锁(闩锁是用于同步对数据库页的访问的对象)。此瓶颈阻碍了存储子系统的全部吞吐量的使用。请注意,如果您决定使用顺序键,并且您使用的是数字键,则始终可以从类型中的最低值开始使用整个范围。例如,在INT类型中,您可以从-2,147,483,648开始,而不是从1开始。

考虑非连续密钥,比如使用NEWID或自定义解决方案生成的随机密钥。当尝试将一行强制放入已满的页面时,SQL Server会执行典型的页面拆分-它会分配一个新页面,并将原始页面中的一半行移动到新页面。页面拆分是有代价的,而且还会导致索引碎片。索引碎片可能会对读取性能产生负面影响。然而,就插入性能而言,如果存储子系统包含许多轴,并且您从多个会话加载数据,那么尽管存在拆分,随机顺序实际上可能比顺序顺序更好。

这是因为在索引的右端没有热点,您可以更好地利用存储子系统的可用吞吐量。可以在http://blog.kejser.org/2011/10/05/boosting-insert-speed-by-generating-scalable-keys/的Thomas Kejser的博客中找到演示此策略的基准测试的一个很好的示例。

来源:查询Microsoft®SQL Server®2012考试70-461培训工具包

票数 14
EN

Stack Overflow用户

发布于 2011-06-24 13:15:45

据我所知,当SQL实例启动时,NEWSEQUENTIALID GUID被初始化为一个随机值。然后,在其操作期间,GUID在中央GUID上递增,而不是通过查看为表生成的最后一个GUID来递增。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1587185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档