我的问题几乎与Changing newid() to newsequentialid() on an existing table
相同如果我改为newsequentialid()而不是索引应该更紧凑,对吗? 如果序列在插入新记录时命中存在ID,会发生什么?数据库会在之前检查吗?
答案 0 :(得分:0)
它会有更少的碎片所以你可以说它'更紧凑。但是对于guid键,它仍然与每个键的大小相同(16字节+开销)。使用顺序guid与非顺序guid的好处是你有更少的页面拆分机会。页面拆分是逻辑页面必须插入记录的位置,但是会允许页面被允许保留,因此页面是“拆分”的;半到一页半到另一页。有时页面拆分会导致另一个页面被拆分,理论上,只需插入一条新记录就可以实现级联和昂贵的页面拆分。当您使用顺序键时,您不太可能在索引中间的某处随机触发页面拆分,因此您可以降低发生这种情况的可能性。使用顺序guid也有助于优化范围扫描(例如,在一个值和另一个值之间进行选择)但使用GUID时,您最终不会进行多次基于范围的扫描,因为该值基本上没有意义。
当序列击中现有的iD时会发生什么?你得到了PK违规。 SQL不能确保GUID只能使用一次。每次重新启动服务器时,顺序ID都会从一个新的种子开始,因此理论上,您可以跳过序列,然后再覆盖相同的值两次。然而,与一般的GUID一样,这种情况发生的可能性在天文数字上很小,在统计上无关紧要。
与所有事情一样,成本和收益取决于您的具体情况。如果您希望用顺序键替换GUID键,请查看是否可以使用int或bigint代理键而不是GUID,因为通常情况下,所有情况都相同,整数在每种情况下都会超过guid。 4百万条记录将非常适合INT数据类型,甚至更简单地适用于bigint。
希望这有帮助。