SQL(尤其是 MS SQL server 2008)如何在内部存储和比较 GUID?是数字还是字符串?另外,使用 GUID 作为主键时性能是否会受到很大影响?
除了这里提到的集群问题: 使用 GUID 作为主键的最佳实践是什么,特别是在性能方面?
我认为它应该是 128 位数字(如此处所述),但我找不到有关如何在 SQL Server 中实现的模式详细信息。
SQL(尤其是 MS SQL server 2008)如何在内部存储和比较 GUID?是数字还是字符串?另外,使用 GUID 作为主键时性能是否会受到很大影响?
除了这里提到的集群问题: 使用 GUID 作为主键的最佳实践是什么,特别是在性能方面?
我认为它应该是 128 位数字(如此处所述),但我找不到有关如何在 SQL Server 中实现的模式详细信息。
性能方面,正常GUID
比INT
SQL Server慢
如果您打算使用GUID
,请使用uniqueidentifier
而不是varchar
作为数据类型。微软没有提到他们是如何实现的,当你uniqueidentifier
用作数据类型时有一些速度优化。
要GUID
在不牺牲整数速度的情况下用作主键,请将GUID
值设置为序列。定义uniqueidentifier
数据类型为 PK,默认设置为NEWSEQUENTIALID()
.
有关详细信息,请参阅NEWSEQUENTIALID (Transact-SQL)。
至于顺序值如何GUID
帮助性能,请参阅GUID 作为主键的成本。
16 个字节,与GUID 结构完全相同:
typedef struct _GUID {
DWORD Data1;
WORD Data2;
WORD Data3;
BYTE Data4[8];
} GUID;
您也可以使用 nvarchar(128)。
次佳选择是 binary(16) 列:
标准 GUID 的长度正好是 16 个字节。如果您必须将其存储为字符串,则长度实际上取决于您选择如何对其进行编码。作为没有连字符的十六进制(AKA base-16 编码),它将是 32 个字符(每个字节两个十六进制数字)。