SQL表主键

时间:2011-11-01 09:38:48

标签: sql primary-key guid primary-key-design

最好使用Guid或Int主键吗?一些搜索结果有利于Guid和其他有利于Int。 那么每个人的利弊究竟是什么呢?

2 个答案:

答案 0 :(得分:2)

对于SQL Server,我个人使用INT IDENTITY来处理大多数主键和群集密钥。

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

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

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

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

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

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

答案 1 :(得分:1)

因为整数主键是顺序的(假设自动递增),所以将行写入DB会更容易。 GUID本质上是随机的,因此插入行会导致页面拆分并降低插入速度。如果您确实希望将GUID用作PK,请考虑使用newsequentialid函数来确保按顺序生成GUID。