为什么在SQL Server中非聚集索引和聚集索引之间的执行计划不同?

问题描述 投票:0回答:1

请解释为什么以下非聚集索引和聚集索引之间的区别。首先,我运行以下两个选择语句。

select * 
from [dbo].[index_test2]  
where id = 1 -- Nonclustered index  on id column

select * 
from [dbo].[index_test1] 
where id = 1  -- Clustered index on id column

执行计划在第一个查询中显示“表扫描”,在第二个查询中显示“聚集索引搜索(聚集)”。

然后我在下面的两个语句中运行。

select id 
from [dbo].[index_test2]  
where id = 1 -- Nonclustered index  on id column

select id 
from [dbo].[index_test1] 
where id = 1  -- Clustered index on id column

执行计划在第一个查询中显示“索引搜索(非群集)”,在第二个查询中显示“聚集的索引搜索(群集)”。

[从以上两种情况中可以看出,当使用聚集索引时,它将用于“索引查找”,但是对于非聚集索引,它将显示“表扫描”(用*执行),并且显示“索引查找(非聚集)” “(使用索引已应用的列ID执行)。

任何人都可以澄清为什么非聚集索引在两种情况下的反应不同吗?

sql sql-server ssms
1个回答
0
投票

聚集索引定义了数据在表中的物理存储顺序,但是非聚集索引不会对表内的物理数据进行排序。实际上,非聚集索引存储在一个位置,而表数据存储在另一个地方。

[如果使用Non-Clustered Index,则在调用它的属性时会在Index seek (NonClustered)模式下工作,但如果将where置于Non-Clustered Index模式下,但又在select中调用了更多非Cover index change模式的表达式, Table scan

带有包含列的索引在覆盖查询时提供最大的好处。这意味着索引包括查询所引用的所有列,因为您可以添加数据类型,数字或大小不允许的列作为索引键列

但是在Clustered Index中,由于实际排序是由它完成的,因此您都可以在Clustered index seek (clustered)模式下同时进行。

© www.soinside.com 2019 - 2024. All rights reserved.