请解释为什么以下非聚集索引和聚集索引之间的区别。首先,我运行以下两个选择语句。
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执行)。
任何人都可以澄清为什么非聚集索引在两种情况下的反应不同吗?
聚集索引定义了数据在表中的物理存储顺序,但是非聚集索引不会对表内的物理数据进行排序。实际上,非聚集索引存储在一个位置,而表数据存储在另一个地方。
[如果使用Non-Clustered Index
,则在调用它的属性时会在Index seek (NonClustered)
模式下工作,但如果将where
置于Non-Clustered Index
模式下,但又在select
中调用了更多非Cover index change模式的表达式, Table scan
带有包含列的索引在覆盖查询时提供最大的好处。这意味着索引包括查询所引用的所有列,因为您可以添加数据类型,数字或大小不允许的列作为索引键列
但是在Clustered Index
中,由于实际排序是由它完成的,因此您都可以在Clustered index seek (clustered)
模式下同时进行。