在所有主键都是GUID的数据库中,使用newid()和newsequentialid()作为“默认值或绑定”有什么区别/暗示和/或优缺点。
我所知道的唯一区别是newid()创建一个新的随机GUID,而不是newsequentialid()根据表中最后一个GUID以递增的方式创建一个新的GUID。
发布于 2009-10-19 06:14:44
当您在DB行中执行insert操作时,它将按照相对于表中其他主键的顺序插入。使用普通的guid,它可以在表中的任何位置。新的newsequentialid()将始终添加到表的末尾。
从而提高了刀片的性能。
This site解释了这两种不同方法之间的差异和基准。
更新-引用的博客帖子已被移动。该链接现在引用web.archive.org链接。这里是关键的外卖:

最引人注目的是NEWID系统函数所需的写入次数。这一点,再加上69%的平均页面密度,是叶级插入的随机分布所导致的页面拆分的证据。页面填满后,需要将其拆分为两页,每页占50%才能完成插入。页面拆分不仅导致页面密度较低,而且使数据页面碎片化得非常严重(有99%的概率下一个数据页面不在当前数据页面的旁边)。在我们的测试中,页面拆分所需的空闲页面最有可能的位置是在表的末尾,而与插入行的位置无关。因此,为了按顺序读取行,扫描需要在广泛分布的拆分页面之间来回跳转,因此出现了令人震惊的碎片。
--斯特凡·德尔马科
发布于 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培训工具包
发布于 2011-06-24 13:15:45
据我所知,当SQL实例启动时,NEWSEQUENTIALID GUID被初始化为一个随机值。然后,在其操作期间,GUID在中央GUID上递增,而不是通过查看为表生成的最后一个GUID来递增。
https://stackoverflow.com/questions/1587185
复制相似问题