复合聚簇索引与非唯一聚簇索引。在这种情况下哪个更好/更差?

时间:2013-12-20 07:38:24

标签: sql-server performance clustered-index

我有一个数据库,其中所有表格都包含Site列(char(4))和PrimaryId列(int)。

目前,所有表上的聚簇索引都是这两列的组合。许多客户只有一个站点,所以在这种情况下,我认为将聚簇索引更改为仅包含PrimaryId是绝对有意义的。

如果有多个网站,我想知道仅使用PrimaryId作为聚集索引仍然有利吗?有一个较小的聚簇索引可能产生比具有唯一索引更好的性能吗?

如果相关,通常不会有多个网站。 10个站点将会很多。

2 个答案:

答案 0 :(得分:6)

答案很简单UNIQUE索引总是比NON-UNIQUE好。它背后有一些数学,但更大的唯一性是更快的服务器可以从索引中查找记录。

CLUSTERED索引很棒,因为它们对磁盘上的记录进行物理排序,并且在UNIQUE键上使用CLUSTERED INDEX总是一个好主意。

使用PRIMARY KEY的CLUSTER INDEX可以为大数据提供非常好的性能。如果您的数据在列中不高,则无关紧要。

答案 1 :(得分:2)

我最近读过一篇关于非聚簇索引如何匹配表行的文章。我将尝试总结一下我认为与您的问题相关的内容。

有两种类型的表(在索引的上下文中):

  • heap - 没有聚簇索引的表
  • 聚集索引 - 具有聚簇索引的表

在第一种情况下非聚集索引使用基于RIP的书签匹配行,该书签具有以下格式:

file number - page number - row number

和非聚集索引看起来像这样:

enter image description here

您可以看到RIP书签为红色。

  

一般来说,堆的行不会移动;一旦他们有了   已被插入页面中的页面。更多   技术上精确:堆中的行很少移动,当它们移动时   移动,他们在旧位置留下转发地址。行的   但是,聚集索引可以移动;也就是说,他们可以重新安置   在数据修改或索引重组期间转到另一页。

在第二个中,非聚集索引使用聚簇索引的索引键作为书签,聚簇索引本身应符合以下几个条件:

  1. 它必须是唯一的
  2. 它应该很短
  3. 应该是静态的
  4. 我将描述第一个标准(其他标准在下面的链接中描述):

      

    每个索引条目书签必须允许SQL Server查找其中的一行   与该条目对应的表。如果您创建群集   索引不是唯一的,SQL Server将生成聚簇索引   通过生成一个“打破平局”的附加值来获得独特的   重复的密钥。此额外值由SQL Server生成以创建   唯一性称为uniquifier,对任何客户端都是透明的   应用。你应该仔细考虑是否允许   由于以下原因,在聚簇索引中重复:

         
        
    1. 生成uniquifiers是额外的开销。 SQL Server必须决定at   插入时间,如果新行的键是现有行的副本   键;如果是,则生成一个uniquifier值以添加到新行

    2.   
    3. uniquifier是一条毫无意义的信息;一个毫无意义的   正在传播到表格中的一条信息   非聚集索引。传播有意义的东西通常更好   将信息写入非聚集索引。

    4.   

    可以找到整篇文章here