根据前端开发人员的建议,我考虑使用 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 一样。这篇文章解释了它们实际上是如何排序的。
幸运的是,该系统仍在开发中。接下来我应该选择哪些选项?
UUIDv6 UUIDv6 重新排序的字节 ------------------------------------ -------------- --------------- 1e712685-714f-6720-a23a-c90103f70be6 c90103f7-0be6-a23a- 6720-1e712685 714f 1e712686-8f82-60c0-ac07-7d6641ed230d 7d6641ed-230d- …