【问题标题】:primary key datatype in sql server databasesql server 数据库中的主键数据类型
【发布时间】:2010-05-22 19:19:08
【问题描述】:

我看到安装 asp.net 成员表后,它们对所有主键字段使用数据类型“唯一标识符”。

我一直在使用“int”数据类型并在插入时加一并将列声明为 IDENTITY。

与我当前在新插入上使用 int 和自动增量的模型相比,使用 uniqueIdentifier 数据类型有什么特别的好处吗?

【问题讨论】:

标签: sql sql-server primary-key uniqueidentifier


【解决方案1】:

我个人将 INT IDENTITY 用于我的大多数主键和集群键。我认为微软选择在他们的 ASP.NET 成员表中使用Uniqueidentifier 是相当不幸的——很多人将该数据库作为其他人的“模板”......

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

SQL Server 中的clustering key 是一种物理构造,用于对数据进行物理排序,要正确处理要困难得多。通常,SQL Server 上的索引女王 Kimberly Tripp 还需要一个良好的集群键,它必须是唯一的、稳定的、尽可能窄的,并且理想情况下是不断增长的(INT IDENTITY 就是这样)。

在此处查看她关于索引的文章:

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

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

在 SQL Server 中,默认情况下,您的主键是您的集群键 - 但并非必须如此。您可以轻松地将 GUID 用作非集群主键,并将 INT IDENTITY 用作集群键 - 只需稍加了解即可。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我也是。除了评论之外,我没有看到任何理由。相反,我们得到的是反对票而不是评论。
    【解决方案3】:

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

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

    INT 列与IDENTITY 一起使用的优点是它更小,因此连接会稍微快一些。但对于大多数用途来说,这不会是一个显着的改进。您还应该首先担心其他一些事情,例如为您的表选择正确的索引。

    【讨论】:

    • 联接确实会稍微影响它,但聚集索引的页面拆分通常是使用自动递增键(或顺序 GUID)的更重要原因。由于用户表可能不需要处理太多的插入,所以 GUID 通常是可以的。
    • @Aaronaught:是的,+1 表示值得考虑,但请注意主键和集群键可以不同。如果是这种情况,这一点就变得无关紧要了。另请注意,在选择聚集索引时,空间问题也是一个重要的考虑因素,因为每个索引都包含聚集键的副本。这将减少每页可以存储的索引条目数。
    • @MarkByers 您的链接似乎没有以前那么有用了。
    猜你喜欢
    • 2010-09-20
    • 1970-01-01
    • 2020-05-05
    • 2012-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    相关资源
    最近更新 更多