2008-11-01 215 views

回答

46

一般来说,int

bigint如果你认为你将有更多的行比宇宙中的原子。

uniqueidentifier,如果你需要全球唯一的密钥(即保证是在所有表中的唯一模式中的钥匙,甚至是唯一的(我不记得了))

另外两个我非常有用不会使用他们不是整数类型(他们有分数,这只是没有多少意义上的关键)

+4

如果您选择了唯一标识符,请考虑将其设置为NONCLUSTERED主键,否则插入可能会出现性能问题。 – Brannon 2008-11-01 06:34:24

+0

感谢Brannon的升级。 – 2008-11-01 16:18:40

+2

int仅限于'仅'约二十亿。 我已经达到这个极限,有一些日志记录功能;) – Mose 2009-11-26 10:44:07

2

一个巨大的原因不使用GUID的PK是他们可怕的索引页填充率 - 这种滥用可能会大大增加您的I/O性能成本。应该将GUID留作AK,并在可能的情况下用int衍生的PK驱动查询。

0

对于32位处理器,int可能是最有效的处理大小。

20

你真的需要保留分开两个不同的问题:

1)主键是一个逻辑结构 - 唯一和可靠地识别你的表中的一行重点候选人之一。这可以是任何东西,真的 - 一个INT,一个GUID,一个字符串 - 选择对你的场景最有意义的东西。

2)聚集键(列或定义表上的“聚集索引”列) - 这是一个物理存储相关的事情,在这里,一个小的,稳定的,持续增长数据类型是您的最佳选择 - INT或BIGINT作为默认选项。

默认情况下,SQL Server表上的主键也用作集群键 - 但这并不需要这样!我个人认为,随着时间的推移,将以前基于GUID的主集群密钥分解为两个单独的密钥(GUID上的主(逻辑)密钥)和单独的INT IDENTITY(1上的集群(排序) ,1)栏。

索引碎片下降到最低水平,因此索引查找性能已升高 - 强烈推荐!

马克

1

为准,以满足您的特定需求