如何通过SQL(特别是MS SQL Server 2008)在内部存储和比较GUID?是数字还是字符串?此外,使用GUID作为主键时是否会有很大的性能影响?
除了这里提到的聚类问题: What are the best practices for using a GUID as a primary key, specifically regarding performance?
我认为它应该是128位数(如here所述),但我找不到有关如何在SQL服务器中实现的模式详细信息。
答案 0 :(得分:13)
性能方面,正常GUID
比SQL Server中的INT
慢
如果您打算使用GUID
,请使用uniqueidentifier
代替varchar
作为数据类型。 Microsoft没有提及它们是如何实现的,当您使用uniqueidentifier
作为数据类型时,会有一些速度优化。
要在不牺牲整数速度的情况下使用GUID
作为主键,请使GUID
值顺序。将uniqueidentifier
数据类型定义为PK,将默认值设置为NEWSEQUENTIALID()
。
有关详细信息,请参阅NEWSEQUENTIALID (Transact-SQL)。
关于顺序GUID
值如何帮助提高效果,请参阅The Cost of GUIDs as Primary Keys。
答案 1 :(得分:8)
16个字节,与GUID structure完全相同:
typedef struct _GUID {
DWORD Data1;
WORD Data2;
WORD Data3;
BYTE Data4[8];
} GUID;
答案 2 :(得分:1)
您还可以使用nvarchar(128)。
下一个最佳选项是一个二进制(16)列:
标准GUID的长度恰好为16个字节。 如果必须将其存储为字符串,则长度实际上取决于您选择对其进行编码的方式。作为不带连字符的十六进制(AKA base-16编码),它将是32个字符(每个字节两个十六进制数字)。