【发布时间】:2020-10-08 13:36:47
【问题描述】:
我正在使用 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 这样的字段不会是唯一字段。如果我没有任何唯一字段,我应该将什么作为聚集索引?
【问题讨论】:
-
For a GUID primary key, it doesn't make sense for it to be the clustered index- 这完全取决于您要解决的问题以及插入数据的性质。有些人会争辩说,增加列对于聚集索引来说是个坏主意,因为这意味着您的所有插入都转到同一页面,从而产生争用或“热点”。例如,Thomas Kejser,demonstrates howNEWID()can outperform sequential inserts,如果您的目标是减少插入瓶颈。 -
您might get better performance 使用新的OPTIMIZE_FOR_SEQUENTIAL_KEY table option in SQL Server 2019 进行顺序插入,但它并不能解决所有争用/延迟问题和may still reveal a different bottleneck。
-
@AaronBertrand - 谢谢,我必须阅读这些资源
标签: sql sql-server newsequentialid