Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server聚集索引是否替换RID查找;索引“;_Sql Server_Clustered Index - Fatal编程技术网

Sql server SQL Server聚集索引是否替换RID查找;索引“;

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“终止

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

例如,如果我有一个带有单个非聚集索引(索引一列)的表,并通过该列搜索一行,它将执行
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
    的特殊隐藏列组成(实际上,该列也附加到聚集索引中)

  • 如果次索引包含聚集索引的某些列,则只有聚集键缺少的部分作为行指针追加

  • 如果二级索引声明为
    唯一
    ,则聚集键仅附加到二级索引的叶级记录


非常好的回答,谢谢,特别是关于INCLUDE的提示,我以前从未遇到过。这些序列是从执行计划中获得的还是从哪里获得的?