0

我正在使用 newsequentialid 为表中的主键生成 GUID。

根据文档(https://docs.microsoft.com/en-us/sql/t-sql/functions/newsequentialid-transact-sql?view=sql-server-ver15),不保证顺序 GUID按顺序生成。

重新启动 Windows 后,GUID 可以从较低的范围重新开始,但仍然是全局唯一的

基本上,它们是有序的,直到您重新启动机器。

对于自动增量主键,它是聚集索引是有意义的,因为它保证插入的行将在末尾。

对于 GUID 主键,将其作为聚集索引没有意义,因为它是随机的,插入的行不太可能位于末尾。

那么顺序 GUID 主键呢?主键应该是聚集索引,还是应该尝试查找另一列,例如 DateCreated 字段?问题是像 DateCreated 这样的字段不会是唯一字段。如果我没有任何唯一字段,我应该将什么作为聚集索引?

4

2 回答 2

3

对于聚集索引,顺序 GUID 比非顺序 GUID 更安全。通常,数据库不会特别频繁地重新启动。重新启动确实会导致页面拆分和碎片,但这通常不是太大的考虑因素,因为重新启动很少见。

也就是说,主键不需要是聚集索引键。您可以将identity列或创建日期/时间作为聚集索引,几乎可以消除此问题。

于 2020-06-18T13:23:22.067 回答
2

不久前我写了一篇关于这个的长文。TL/DR 是使用顺序 GUID 作为聚集索引键很好。GUID 实际上是插入到索引的中间,但是具有少量(这里是一个)中间索引插入点不会导致昂贵的页面拆分或导致有害的碎片。

良好的页面拆分和顺序 GUID 密钥生成

同样的行为适用于使用复合键作为聚集索引,其中前导键列具有较低的基数。例如(客户 ID、交易 ID)。每个 CustomerId 将有一个半满的页面,其中包含下一个 TransactionId 的空间,当该页面填满时,将分配一个新页面。

于 2020-06-18T13:39:44.953 回答