SQL SERVER - INT Vs GUID - 我们应该使用它

时间:2013-03-01 05:51:34

标签: sql-server int guid

我有问题,我们应该在表中使用Int / GUID。使用此方案。

使用BIGINT作为主键 - 群集等,用于连接,快速检索等。这是为了检索和用户便利而优化。

GUID作为记录的唯一标记,这是您在跨服务器/应用程序等移植数据时使用的内容。这将永远不会向用户显示,但会标记为所有记录。

这为您提供了两全其美的优势,您可以避免使用GUIDs作为主键的碎片和性能损失,但是当您在系统之间移动数据/共享它时可以保留其优势,因为您可以独立识别记录。

有些人可能认为额外的存储成本过高,但我认为从长远来说,花费几美元在SAN上比在同一数据栏中尝试做两件事更便宜。

1 个答案:

答案 0 :(得分:8)

我个人使用INT IDENTITY来处理我的主要和群集密钥。

您需要将主键分开,这是一个逻辑结构 - 它唯一标识您的行,它必须是唯一且稳定的NOT NULLGUID也适用于主键 - 因为它保证是唯一的。如果使用SQL Server复制,则GUID作为主键是一个不错的选择,因为在这种情况下,无论如何都需要唯一标识GUID列。

SQL Server中的集群密钥是一个物理结构,用于数据的物理排序,并且更难以正确使用。通常,SQL Server上的索引女王Kimberly Tripp也要求一个好的聚类键是唯一的,稳定的,尽可能窄的,并且理想情况下不断增加(INT IDENTITY是一个)。

请参阅她关于索引的文章:

还可以看到Jimmy Nilsson的The Cost of GUIDs as Primary Key

GUID对于群集密钥来说是一个非常糟糕的选择,因为它很宽,完全随机,因此导致错误的索引碎片和糟糕的性能。此外,群集密钥行也存储在每个非群集(附加)索引的每个条目中,因此您确实希望保持较小 - GUID为16字节,而INT为4字节,并且有几个非聚集索引和几百万行,这会产生巨大的差异。

在SQL Server中,您的主键默认情况下是您的群集密钥 - 但它不一定是。您可以轻松地将GUID用作NON-Clustered主键,并使用INT IDENTITY作为您的群集密钥 - 只需要了解它就可以了。