我想问一个问题来优化SQL Server性能。假设我有一个实体 - 比如Item
- 我必须为它分配一个主键。它有列,其中两个预计是唯一的,其中一个预计比另一个大几十个字符。
我应该如何决定主键?
其中一个是PK,如果是,那么哪一个,或者我应该创建一个身份号码作为PK?这对我来说很重要,因为实体"项目"会与其他一些实体有关系,我认为PK的复杂性会影响SQL Server查询的性能。
答案 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个字符长的字符串表示,在大多数情况下作为主键表现良好。