根据SQL Server中的值大小确定主键

时间:2015-02-28 11:57:46

标签: sql sql-server entity-framework primary-key identity

我想问一个问题来优化SQL Server性能。假设我有一个实体 - 比如Item - 我必须为它分配一个主键。它有列,其中两个预计是唯一的,其中一个预计比另一个大几十个字符。

我应该如何决定主键?

其中一个是PK,如果是,那么哪一个,或者我应该创建一个身份号码作为PK?这对我来说很重要,因为实体"项目"会与其他一些实体有关系,我认为PK的复杂性会影响SQL Server查询的性能。

3 个答案:

答案 0 :(得分:1)

就个人而言,我会使用IDENTITY主键,对所提到的唯一键和附加查找索引都有唯一约束。

您必须记住,默认情况下,SQL Server会将主键创建为聚簇索引,这会影响它在磁盘上的存储方式。如果新的ITEMS随机出现,那么主键上可能存在大量碎片。

此外,除非启用了级联和外键,否则您必须手动维护数据的关系完整性(除非您使用IDENTITY

答案 1 :(得分:1)

嗯,主键实际上只用于唯一标识每一行 - 所以它的唯一要求是:必须是唯一的 strong>,通常也不应包含NULL

其他任何内容很可能与SQL Server中的群集密钥更相关 - 数据在磁盘上物理排序的列(或列集)。默认情况下,主键也是SQL Server中的群集键。

群集密钥是SQL Server中最重要的选择,因为它具有深远的性能影响。 良好群集密钥

  • 独特
  • 稳定
  • 如果可能的话,不断增加

它必须是唯一的,以便可以将它添加到每个单独的非聚簇索引中以查找实际数据表 - 如果选择一个非唯一列(或一组列),SQL Server将添加一个4为你而战的“独特的”。

它应该尽可能地窄,因为它存储在很多地方。尝试为INT坚持4个字节或为BIGINT坚持8个字节 - 避免长和VARCHAR列,因为这些列太宽,可变长度也带来额外的开销。因此,列数集也很少是一个很好的选择。

群集密钥应该稳定 - 值不应随时间变化 - 因为每次值更改时,可能会有很多索引条目(在聚簇索引本身中,以及每个非聚簇索引)也需要更新,这会导致很多不必要的开销。

如果它不断增加(如INT IDENTITY),您还可以避免大多数页面拆分 - 如果您使用随机值(如GUID的话)会发生非常昂贵且涉及的程序)作为你的聚类键。

简而言之:INT IDENTITY是理想的 - GUID,可变长度字符串或列组合通常不是一个好的选择。

答案 2 :(得分:0)

选择您将用于识别查询中记录并加入其他表的记录。大小是相对的,虽然考虑通常不是问题,因为PK将被索引,而另一个唯一列也可以使用唯一索引。

例如uniqueidentifier数据类型是一个36个字符长的字符串表示,在大多数情况下作为主键表现良好。