SQL服务器数据库中的主键数据类型

问题描述:

我在安装asp.net成员资格表后看到,他们对所有主键字段使用数据类型“uniqueidentifier”。SQL服务器数据库中的主键数据类型

我一直在使用“int”数据类型,并对insert进行加1,并将列声明为IDENTITY。

使用uniqueIdentifier数据类型与使用int和auto插入新模型的当前模型相比,有什么特别的好处吗?

+0

你的桌子上有什么聚集索引?如果通过Id字段进行聚类,则顺序int将导致插入的页面拆分次数少于GUID和newid()。 – 2010-05-22 19:49:56

+2

可能的重复[使用uniqueidentifier(GUID)还是bigint作为标识列更好?](http://*.com/questions/504905/is-it-better-to-use-an-uniqueidentifierguid -or-a-bigint-for-an-identity-column)(以及许多其他人不胜枚举) – Aaronaught 2010-05-22 19:54:12

我个人对我的大多数主键和集群键都使用INT IDENTITY。我认为很不幸,微软选择在他们的ASP.NET会员表中使用Uniqueidentifier--很多人把该数据库当作其他模板使用。“

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

集群密钥在SQL Server中是一种物理结构,用于数据的物理排序,而且要正确得多。通常,SQL Server上的索引女王Kimberly Tripp也需要一个优秀的集群密钥,以保持唯一,稳定,尽可能窄,并且理想情况下不断增加(INT IDENTITY)。

看到她文章的索引位置:

,也看到吉米·尼尔森的The Cost of GUIDs as Primary Key

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

在SQL Server中,您的主键默认情况下是您的集群密钥 - 但并非必须如此。您可以轻松使用GUID作为您的非群集主键,并将INT IDENTITY用作您的群集键 - 它只需要一点点知道它。

uniqueidenfitier解决了复制问题。对于表的两个复制版本,可以插入具有相同整数值的键的行,但假设该列的值设置为newid,则它们不可能使用相同的uniqueidentifier进行插入。

+0

+1这是一个很好的观点。 – 2010-05-22 19:27:32

+0

我很想知道为什么这是downvoted。 – 2010-05-22 23:19:22

+1

我也是。除了评论外,我没有看到任何理由。相反,我们得到的是downvote而不是评论。 – 2010-05-22 23:26:36

我一直在使用“int”数据类型并在插入时增加1。

在SQL Server中,获取自动递增列的方法是使用IDENTITY。我不确定这是否是你的意思,所以我想我会澄清这一点以防万一。

IDENTITY一起使用INT列的优势在于它更小,因此连接速度会稍快。但对于大多数目的而言,这不会是一个重大改进。还有其他一些你应该首先担心的事情,比如为表格选择正确的索引。

+0

是的,身份是我的意思。我澄清了问题 – leora 2010-05-22 19:31:11

+1

连接稍微考虑了因素,但聚簇索引的页面拆分通常是使用自动递增键(或连续GUID)的更重要原因。由于用户表可能不需要处理太多插入,所以GUID通常是可以的。 – Aaronaught 2010-05-22 19:48:24

+0

@Aaronaught:真的,值得注意的是+1,但请注意,主键和聚簇键可以不同。如果是这种情况,这一点变得无关紧要。另请注意,选择聚集索引时,空间问题也是一个重要考虑因素,因为每个索引都包含聚集键的副本。这将减少每页可存储的索引条目的数量。 – 2010-05-22 19:56:49