0

我的问题几乎与在现有表上将 newid() 更改为 newsequentialid()相同

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

4

1 回答 1

0

碎片会更少所以你可以说它更紧凑。但是对于 guid 键,每个键的大小仍然相同(16 字节 + 开销)。使用顺序 guid 与非顺序 guid 的好处是页面拆分的机会更少。页面拆分是逻辑页面必须插入记录的地方,但会超过页面允许容纳的数量,因此页面被“拆分”;一半到一页,一半到另一页。有时页面拆分会导致另一个页面拆分,理论上您可以通过插入一条新记录来进行级联且代价高昂的页面拆分。当您使用顺序键时,您不太可能在索引中间的某个位置随机触发页面拆分,因此您降低了发生这种情况的可能性。使用顺序 guid 还有助于优化范围扫描(例如

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

与所有事情一样,成本和收益取决于您的具体情况。如果您想用顺序键替换 GUID 键,请查看是否可以使用 int 或 bigint 代理键来代替 GUID,因为通常情况下,在所有条件相同的情况下,整数在任何情况下都会胜过 GUID。400 万条记录将很容易适应 INT 数据类型,甚至更容易适应 bigint。

希望这可以帮助。

于 2015-02-19T02:25:18.077 回答