3

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

使用 aBIGINT作为主键 - 集群等,用于连接、快速检索等。即,这是为检索和用户方便而优化的。

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

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

有些人可能会争辩说额外的存储成本过高,但我想说从长远来看,在 SAN 上多花几美元比尝试用相同的数据列做两件不同的事情更便宜。

4

1 回答 1

8

我个人使用我INT IDENTITY的大部分主键和集群键。

您需要将主键分开,这是一个逻辑结构 - 它唯一标识您的行,它必须是唯一且稳定的,并且NOT NULL. AGUID也适用于主键 - 因为它保证是唯一的。GUID如果您使用 SQL Server 复制,作为主键的 A 是一个不错的选择,因为在这种情况下,无论如何您都需要一个唯一标识列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 用作非集群主键,并将 INT IDENTITY 用作集群键 - 只需稍加注意即可。

于 2013-03-01T05:54:13.187 回答