我有一个数据库,其中所有表格都包含Site
列(char(4)
)和PrimaryId
列(int
)。
目前,所有表上的聚簇索引都是这两列的组合。许多客户只有一个站点,所以在这种情况下,我认为将聚簇索引更改为仅包含PrimaryId
是绝对有意义的。
如果有多个网站,我想知道仅使用PrimaryId
作为聚集索引仍然有利吗?有一个较小的聚簇索引可能产生比具有唯一索引更好的性能吗?
如果相关,通常不会有多个网站。 10个站点将会很多。
答案 0 :(得分:6)
答案很简单UNIQUE索引总是比NON-UNIQUE好。它背后有一些数学,但更大的唯一性是更快的服务器可以从索引中查找记录。
CLUSTERED索引很棒,因为它们对磁盘上的记录进行物理排序,并且在UNIQUE键上使用CLUSTERED INDEX总是一个好主意。
使用PRIMARY KEY的CLUSTER INDEX可以为大数据提供非常好的性能。如果您的数据在列中不高,则无关紧要。
答案 1 :(得分:2)
我最近读过一篇关于非聚簇索引如何匹配表行的文章。我将尝试总结一下我认为与您的问题相关的内容。
有两种类型的表(在索引的上下文中):
在第一种情况下非聚集索引使用基于RIP的书签匹配行,该书签具有以下格式:
file number - page number - row number
和非聚集索引看起来像这样:
您可以看到RIP书签为红色。
一般来说,堆的行不会移动;一旦他们有了 已被插入页面中的页面。更多 技术上精确:堆中的行很少移动,当它们移动时 移动,他们在旧位置留下转发地址。行的 但是,聚集索引可以移动;也就是说,他们可以重新安置 在数据修改或索引重组期间转到另一页。
在第二个中,非聚集索引使用聚簇索引的索引键作为书签,聚簇索引本身应符合以下几个条件:
我将描述第一个标准(其他标准在下面的链接中描述):
每个索引条目书签必须允许SQL Server查找其中的一行 与该条目对应的表。如果您创建群集 索引不是唯一的,SQL Server将生成聚簇索引 通过生成一个“打破平局”的附加值来获得独特的 重复的密钥。此额外值由SQL Server生成以创建 唯一性称为uniquifier,对任何客户端都是透明的 应用。你应该仔细考虑是否允许 由于以下原因,在聚簇索引中重复:
生成uniquifiers是额外的开销。 SQL Server必须决定at 插入时间,如果新行的键是现有行的副本 键;如果是,则生成一个uniquifier值以添加到新行
- 醇>
uniquifier是一条毫无意义的信息;一个毫无意义的 正在传播到表格中的一条信息 非聚集索引。传播有意义的东西通常更好 将信息写入非聚集索引。
可以找到整篇文章here。