sql-server - SQL Server聚集索引是否替换了RID查找 "index"

标签 sql-server clustered-index

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

例如,如果我有一个带有单个非聚集索引(索引一列)的表,并通过该列搜索行,它将执行索引查找 -> RID -> 数据行查找 -> 结果

但是,如果我在不同的列上添加聚集索引,则相同的查询将执行以下操作索引查找 -> 提取聚集键 -> 聚集索引查找 -> 结果

这对我来说意味着非聚集索引不再以叶子处的 RID“终止”,而是以聚集索引的聚集键“终止”?是这样吗?

最佳答案

是的,你已经很清楚了。

当您有聚集索引时,任何非聚集索引也将包含聚集索引中的列,作为对实际数据的“查找”。

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

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

关于sql-server - SQL Server聚集索引是否替换了RID查找 "index",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3711232/

相关文章:

oracle - 我应该避免使用主键并使用索引的唯一列吗?

sql-server - Sql Server 索引包含主键吗?

sql-server - 如何在 SQL Server 并行数据仓库表中插入多行

PHP mssql 对于不同的语句表现得很奇怪

sql-server - SQL Server 堆与堆聚集索引

sql - 外键或主键上的聚集索引?

sql - Foreach 循环文件名

SQL Server : how to get a database name as a parameter in a stored procedure

mysql - SQL 如何在为另一个表生成输出后列出 NULL 值

sql-server - 聚集索引如何在 View 上实现