首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么SQL Server中的非聚集索引和聚集索引在执行计划上存在差异?

为什么SQL Server中的非聚集索引和聚集索引在执行计划上存在差异?
EN

Stack Overflow用户
提问于 2019-12-24 05:59:29
回答 1查看 89关注 0票数 0

请解释为什么非聚集索引和聚集索引之间存在以下差异。首先,我运行以下两个select语句。

代码语言:javascript
运行
AI代码解释
复制
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

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

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

代码语言:javascript
运行
AI代码解释
复制
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

执行计划为第一个查询显示“索引查找(NonClustered)”,为第二个查询显示“聚集索引查找(群集)”。

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

有人能解释一下为什么NonClustered指数在这两种情况下的反应不同吗?

EN

回答 1

Stack Overflow用户

发布于 2019-12-24 07:56:38

聚集索引定义数据在物理上存储在表中的顺序,但非聚集索引不会对table.In事实中的物理数据进行排序,非聚集索引存储在一个位置,而表数据存储在另一个位置。

如果您使用Non-Clustered Index,则当您调用它属性时,它将在Index seek (NonClustered)模式下工作,但如果您将where置于Non-Clustered Index模式,但在select中调用了更多未覆盖索引更改模式的表达式,则会将其更改为Table scan

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

但是在Clustered Index中,因为实际的排序是由它来完成的,所以在Clustered index seek (clustered)模式下可以同时完成这两项工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59464449

复制
相关文章

相似问题

在有定义的地方合并

21

For循环返回重复的NA值

16

合并列并在没有值的地方添加NA

30

在有多个系统引用的地方收集最高值

211

用NA值擦除重复项

32
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档