SQL Server聚簇索引是否替换RID查找“索引”

时间:2010-09-14 17:10:35

标签: sql-server clustered-index

当一个表在SQL Server中有聚簇索引时,是否意味着所有索引查询都将通过聚簇索引进行?

例如,如果我有一个包含单个非聚集索引的表(索引一列)并通过该列搜索一行,它将执行Index Seek -> RID -> Data row lookup -> Result

但是如果我在不同的列上添加聚簇索引,那么相同的查询将执行以下Index Seek -> Extract clustering key -> Clustered index seek -> Results

这对我来说意味着非聚集索引不再在叶子上使用RID“终止”,而是使用聚簇索引的聚类键?是吗?

3 个答案:

答案 0 :(得分:13)

是的,你已经弄明白了。

当你有一个聚簇索引时,任何非聚集索引都会包含聚集索引中的列作为它们“查找”到实际数据中的列。

如果在非聚集索引中搜索值,并且需要访问基础数据的其余列,则SQL Server会从非聚簇索引执行“书签查找”(或“键查找”)索引到聚簇索引(包含数据本身,在叶级节点中)。使用聚簇索引,您不再需要RID了 - 因此,如果RID发生更改(数据从一个页面移动到另一个页面),则不必更新所有索引页面。

书签查找是相当昂贵的操作,因此您可以通过INCLUDE语句向非聚集索引添加其他列。这样,您的非聚集索引将在其叶级别页面上包含这些附加列,如果您只需要包含在该数据集中的列,则可以从非聚集索引本身满足您的查询(在例如,它被称为“覆盖索引”),您可以自己保存一系列书签查找。

答案 1 :(得分:1)

没有。并非每个查询都将使用聚集索引。如果查询被非聚集索引“覆盖”(查询所需的所有列都包含在NC索引中),那么SQL Server只需要读取这些索引页面而不执行书签查找。实际上,优化器通常更喜欢使用覆盖NC索引,因为NC索引通常小于聚簇索引,因此通常扫描速度更快。

答案 2 :(得分:1)

  

当一个表在SQL Server中有聚簇索引时,是否意味着所有索引查询都将通过聚簇索引进行?

没有

如果查询仅使用二级索引和/或聚簇索引所涵盖的字段,则二级索引可能(并且很可能将)是首选。

CREATE TABLE test (id INT NOT NULL PRIMARY KEY, value1 INT NOT NULL, value2 INT NOT NULL)

CREATE INDEX ix_test_value2 ON test (value2)

SELECT  value2, id
FROM    test

上面的查询最有可能使用ix_test_value2,因为它包含查询所需的所有信息,但尺寸较小。

  

这对我来说意味着非聚集索引不再在叶子上使用RID“终止”,而是使用聚簇索引的聚类键?是吗?

是的,稍作修正:

  • 如果聚簇索引是非唯一的,则辅助索引中的行指针由聚簇键和一个名为uniquiefier的特殊隐藏列组成(实际上,此列也附加到聚簇索引) )。

  • 如果辅助索引覆盖了聚簇索引的某些列,则只将聚簇键的缺失部分作为行指针附加。

  • 如果二级索引声明为UNIQUE,则聚簇键仅附加到二级索引的叶级记录。