NEWSEQUENTIALID 在许多表的数据库中是唯一的吗?

2 performance database-design sql-server sql-server-2016 performance-tuning

NEWSEQUENTIALID 在数据库中是唯一的吗?我们用 NEWSEQUENTIALID 在数据库中规划了许多表,同时插入并希望确保每个 guid 都是唯一的,无论它们是否在不同的表中。

常规 NEWID() 将保证数据库中的唯一性,并且有重复的机会是被小行星/闪电击中的机会,但是它们并不能缓解碎片问题。

这篇文章讨论了 Mac 地址,但是我想为上面特定的数据库指定问题。 /sf/ask/1988347511/

Geo*_*ios 5

根据Microsoft Docs,该值在每台计算机上都是唯一的,并且只要相关计算机具有网卡,该值在多台计算机上也是唯一的(假设生成算法使用从网卡中获取的一些值来生成 GUID)

使用 NEWSEQUENTIALID 生成的每个 GUID 在该计算机上都是唯一的。仅当源计算机具有网卡时,使用 NEWSEQUENTIALID 生成的 GUID 在多台计算机上都是唯一的。

除此之外,围绕这种独特性似乎确实存在一些警告:

UuidCreateSequential 函数具有硬件依赖性。在 SQL Server 上,当数据库(例如包含的数据库)移动到其他计算机时,可能会形成顺序值簇。在 SQL 数据库上使用 Always On 时,如果数据库故障转移到其他计算机,则可能会形成顺序值集群。

在UuidCreateSequential页面上我们还可以看到,如果网卡存在,该函数保证在计算机之间是唯一的

具有以太网/令牌环地址的计算机生成保证全局唯一的 UUID。


Zan*_*ane 5

根据 Microsoft文档

NEWSEQUENTIALID

创建一个 GUID,该 GUID 大于自 Windows 启动以来此函数在指定计算机上先前生成的任何 GUID。重新启动 Windows 后,GUID 可以从较低的范围再次启动,但仍然是全局唯一的

我建议NEWSEQUENTIALIDNEWID()任何不依赖内置随机性的情况下使用over ,主要是由于与随机 GUID 相关的碎片问题。Kimberly Tripp有一篇很棒的文章,介绍了NEWID()在主键上使用的一些陷阱。

有几种情况NEWSEQUENTIALID可能无法保证文档中列出的唯一性。

UuidCreateSequential 函数具有硬件依赖性。在 SQL Server 上,当数据库(例如包含的数据库)移动到其他计算机时,可能会形成连续值的集群。使用 Always On 和 on SQL 数据库时,如果数据库故障转移到另一台计算机,则可能会形成连续值集群。

但是,从您的问题的措辞来看,这似乎将包含在单个数据库服务器上。

还值得注意的是(不是它适用于此处)NEWSEQUENTIALID可以预测,因此如果该 GUID 的隐私是一个问题,这也可能是一个问题。