在现有的 table 上更改为 newsequentialid() 和 400 万条记录

Changing to newsequentialid() on an existing table with 4 million records

我的问题和Changing newid() to newsequentialid() on an existing table几乎一样

如果我更改为 newsequentialid() 索引应该更紧凑,对吗? 如果序列在插入新记录时遇到了存在的 ID,会发生什么情况?数据库会检查之前吗?

它将有更少的碎片,所以你可以说它更紧凑。但是对于 guid 密钥,每个密钥的大小仍然相同(16 字节 + 开销)。使用顺序 guid 与非顺序 guid 的好处是页面拆分的机会更少。页面拆分是逻辑页面必须插入记录的地方,但会超过允许容纳的页面,因此页面为 "split";一半到一页,一半到另一页。有时,一个页面拆分会导致另一个页面拆分,理论上,您只需插入一条新记录就可以进行级联且代价高昂的页面拆分。当您使用顺序键时,您不太可能随机触发索引中间某处的页面拆分,因此您降低了发生这种情况的可能性。使用顺序 guid 还有助于优化范围扫描(例如,在一个值和另一个值之间进行选择)但是使用 GUID,您不太可能最终进行许多基于范围的扫描,因为该值基本上没有意义。

当序列命中一个现有的 iD 时会发生什么?你得到了 PK 违规。 SQL 不能确保 GUID 只能使用一次。每次服务器重新启动时,顺序 ID 都会从一个新的种子开始,因此理论上,您可以在序列中向后跳,然后结束两次覆盖相同的值。然而,与一般的 GUID 一样,发生这种情况的可能性在天文数字上如此之小,以至于在统计上微不足道。

与所有事情一样,成本和收益取决于您的具体情况。如果您希望用顺序键替换 GUID 键,请查看是否可以使用 int 或 bigint 代理键而不是 GUID,因为通常情况下,在所有条件相同的情况下,整数在任何情况下都优于 guid。 400 万条记录可以简单地放入一个 INT 数据类型,更可以放入一个 bigint。

希望对您有所帮助。