2

在SQL Server 2008 R2的文档中说明:

宽键是几个列或几个大列的组合。来自聚集索引的键值被所有非聚集索引用作查找键。在同一个表上定义的任何非聚集索引都将明显更大,因为非聚集索引条目包含聚集键以及为该非聚集索引定义的键列。

这是否意味着,当使用非聚集索引进行搜索时,聚集索引也是搜索?我最初认为非聚集索引直接包含页面(块)的地址及其引用的行。从上面的文字看来,它似乎只包含来自非聚集索引的键而不是地址。

有人可以解释一下吗?

4

1 回答 1

3

是的,这正是发生的事情:

  • SQL Server 在非聚集索引中搜索您的搜索值
  • 如果找到匹配项,则在该索引条目中,还有聚集键(构成聚集索引的一列或多列)
  • 使用该聚集键,现在执行键查找(通常也称为书签查找) - 在聚集索引中搜索给定的值
  • 当找到该项目时,聚集索引导航结构的叶子级别的整个数据记录都存在并且可以返回

SQL Server 这样做,因为使用物理地址真的很糟糕:

  • 如果发生页面拆分,则将更新移动到新页面的所有条目
  • 对于所有这些条目,所有非聚集索引也必须更新

这对性能真的很不利。

SELECT这就是为什么在非聚集索引中使用有限的列列表(而不是 always SELECT *)甚至可能在非聚集索引中包含一些额外的列(以使其成为覆盖索引)是有益的原因之一。这样,您可以避免不必要且昂贵的书签查找。

而且因为集群键包含在每个非聚集索引中,所以它是一个而窄的键是非常重要的——最好是一个INT IDENTITY或类似的东西——而不是一个巨大的结构;群集键是 SQL Server 中复制最多的数据结构,应尽可能小。

这些书签查找相对昂贵的事实也是查询优化器可能会在您选择大量行后立即选择索引扫描的原因之一 - 有时,仅扫描聚集索引可能比这样做便宜很多关键查找。

于 2013-05-24T08:41:01.887 回答