代码之家  ›  专栏  ›  技术社区  ›  Mike Q

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

  •  13
  • Mike Q  · 技术社区  · 14 年前

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

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

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

    这意味着非聚集索引不再“终止”于叶中的RID,而是使用聚集索引的聚集键?是吗?

    3 回复  |  直到 14 年前
        1
  •  13
  •   marc_s Anurag    14 年前

    是的,你已经很明白了。

    当您有一个聚集索引时,任何非聚集索引也将包含来自聚集索引的列作为它们在实际数据中的“查找”。

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

    书签查找是相当昂贵的操作,因此可以通过 INCLUDE 声明。这样,非聚集索引将在其叶级页上包含这些附加列,如果您只需要包含在该数据集中的列,则可以从非聚集索引本身(在这种情况下,它称为“覆盖索引”)满足您的查询,并可以保存rself一系列书签查找。

        2
  •  1
  •   nvogel    14 年前

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

        3
  •  1
  •   Quassnoi    14 年前

    当一个表在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 ,聚集键只附加到辅助索引的叶级记录。

    推荐文章