有大量可用信息详细说明为什么在大多数IDENTITY
情况下应将字段用作表的主键和聚集索引;但是我很难决定我的特殊情况是否属于例外情况。
我有一个包含大约 250 列(我不想开始规范化辩论)和大约 1 亿行的表。该表是页面压缩的。在高峰期,大约有 100 万行按顺序输入到表中,其他连接的争用为 0。char(2) NOT NULL
字段与字段的组合int NOT NULL
保证是唯一的,永不改变。该字段只有大约 10 个唯一值char(2)
。
IDENTITY
我对将列用作聚簇索引的论点完全基于性能。由于插入将按顺序发生,因此我不必担心闩锁争用;因此插入应该更快,因为不需要搜索索引。另一方面,6 字节的复合密钥相当小;无论如何,我最终都会将其设为主键(char(2)
首先是字段)。此外,还有一些其他表是根据该表中的新行批量加载的(可能通过过滤索引)。如果我使用一个IDENTITY
列,我可能会将该列用作这些其他表(没有IDENTITY
属性)的聚集索引和主键,而不是引入“自然”复合键。
在复合键上创建非聚集索引是否会使使用IDENTITY
列作为聚集索引的预期速度提升无效,因为在完成插入时必须搜索该索引?
编辑
根据评论,我更改了标题并提出了一个修改后的问题,其答案可用于回答上述原始问题。在插入方面,唯一聚集索引的维护与唯一非聚集索引的维护相比如何?非顺序聚集索引是否与非顺序非聚集索引类似?
尴尬的是,我从来不知道列存储索引。该表主要用于分析;因此,根据 David Browne - Microsoft 在评论中的建议,我使用了一个聚集列存储索引,该索引在
char(2)
和字段上定义了一个主键。int
由于问题是关于聚集索引维护与非聚集索引维护的比较,因此我将尽我所能“回答”该部分。根据我的阅读,当聚集索引具有页面拆分时比在较小的非聚集索引(具有相同的键)上进行页面拆分需要更多的资源。这是因为该页在聚簇索引中包含的数据要多得多。因此,如果我没有使用列存储聚集索引,我会使用(并测试)
IDENTITY
聚集索引的列。话虽如此,评论中提供的视频 sp_BlitzErik非常内容丰富——对像我这样的普通人来说很容易理解——并强调了如何有很多基于 SQL Server 旧实现的过时建议“在那里”;因此,可能会夸大对外部碎片化的担忧。