Sql server SQL Server聚集索引是否替换RID查找;索引“;
当SQL Server中的表具有聚集索引时,是否意味着所有索引查询都将通过聚集索引进行 例如,如果我有一个带有单个非聚集索引(索引一列)的表,并通过该列搜索一行,它将执行Sql server SQL Server聚集索引是否替换RID查找;索引“;,sql-server,clustered-index,Sql Server,Clustered Index,当SQL Server中的表具有聚集索引时,是否意味着所有索引查询都将通过聚集索引进行 例如,如果我有一个带有单个非聚集索引(索引一列)的表,并通过该列搜索一行,它将执行index Seek->RID->Data row lookup->Result 但是如果我在不同的列上添加聚集索引,那么相同的查询将执行以下操作index Seek->Extract clustering key->clustering index Seek->Results 这对我来说意味着非聚集索引不再在叶上以RID“终止
index Seek->RID->Data row lookup->Result
但是如果我在不同的列上添加聚集索引,那么相同的查询将执行以下操作index Seek->Extract clustering key->clustering index Seek->Results
这对我来说意味着非聚集索引不再在叶上以RID“终止”,而是以聚集索引的聚集键“终止”?是这样吗?是的,你已经很清楚了 如果有聚集索引,则任何非聚集索引也将包含聚集索引中的列,作为它们在实际数据中的“查找” 如果在非聚集索引中搜索某个值,并且需要访问基础数据的其余列,则SQL Server会将该非聚集索引中的“书签查找”(或“键查找”)执行到聚集索引(在叶级节点中包含数据本身)中。使用聚集索引,您不再需要RID,因此,如果RID发生更改(当数据从一个页面移动到另一个页面时),您不必更新所有索引页面
书签查找是非常昂贵的操作,因此您可以通过
INCLUDE
语句向非聚集索引添加额外的列。这样,非聚集索引将在其叶级页面上包含这些额外的列,如果您只需要包含在该数据集中的列,则可以通过非聚集索引本身(在这种情况下,它被称为“覆盖索引”)来满足您的查询您还可以保存一系列书签查找。否。不是每个查询都会使用聚集索引。如果查询被非聚集索引“覆盖”(查询所需的所有列都包含在NC索引中),则SQL Server只需读取这些索引页,而不执行书签查找。事实上,优化器通常会尽可能使用覆盖NC索引,因为NC索引通常比聚集索引小,因此通常扫描速度更快
当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
- 如果次索引包含聚集索引的某些列,则只有聚集键缺少的部分作为行指针追加
- 如果二级索引声明为
,则聚集键仅附加到二级索引的叶级记录唯一