小编oop*_*oop的帖子

我应该将前端生成的 UUIDv6 转换为 binary(16) 以在 SQL Server 中用作群集主键吗?

背景

根据前端开发人员的建议,我考虑使用 UUID 作为新系统中一堆表的主键。从了解随机 UUID 与顺序 UUID 的优缺点,到将非聚集主键与可排序类型的聚集索引结合使用,我的研究向我指出了UUIDv6及其实现

它能够生成如下所示的 UUID(即顺序的):

UUIDv1 UUIDv6 
------------------------------------ -------------- --------------- 
5714f720-1268-11e7-a24b-96d95aa38c32 1e712685-714f-6720-a23a-c90103f70be6 
68f820c0-1268-11e7-a24b-96d95aa38c32 1e712686-8f82-60c0-ac07-7d6641ed230d 
7ada38f0-1268-11e7-a24b-96d95aa38c32 1e712687-ada3-68f0-93f8-c1ebf8e6fc8c 
8cc06fd0-1268-11e7-a24b-96d95aa38c32 1e712688-cc06-6fd0-a828-671acd892c6a 
9ea6a6b0-1268-11e7-a24b-96d95aa38c32 1e712689-ea6a-66b0-910c-dbcdb07df7a4

我认为 SQL Server 会很乐意在群集主键(唯一标识符)列中为我排序。

我几乎不知道 SQL Server 如何对 uniqueidentifier 列进行排序。这是升序排序结果:

UUIDv6 唯一标识符排序 
--------------------- 
1e712688-cc06-6fd0-a828- 67 1acd892c6a 
1e712686-8f82-60c0-ac07- 7D 6641ed230d 
1e712687-ada3-68f0-93f8- c1 ebf8e6fc8c 
1e712685-714f-6720-a23a- c9 0103f70be6 
1e712689-ea6a-66b0-910c- db cdb07df7a4

这会导致碎片,就像使用随机 UUID 一样。这篇文章解释了它们实际上是如何排序的。

真正的问题

幸运的是,该系统仍在开发中。接下来我应该选择哪些选项?

  1. 重新排序字节,以便最高/最低有效字节是 SQL Server 期望它们所在的位置
UUIDv6 UUIDv6 重新排序的字节 
------------------------------------ -------------- --------------- 
1e712685-714f-6720-a23a-c90103f70be6 c90103f7-0be6-a23a- 6720-1e712685 714f 
1e712686-8f82-60c0-ac07-7d6641ed230d 7d6641ed-230d- …

sql-server clustered-primary-key uuid

5
推荐指数
2
解决办法
182
查看次数

标签 统计

clustered-primary-key ×1

sql-server ×1

uuid ×1