"群集索引扫描(群集)"对SQL Server执行计划意味着什么?

Bin*_*Bin 24 sql sql-server sql-execution-plan

我有一个查询无法执行"无法为数据库'TEMPDB'分配新页面,因为文件组'DEFAULT'中的磁盘空间不足".

在解决问题的方式我正在检查执行计划.有两个标记为"聚集索引扫描(聚集)"的昂贵步骤.我很难找出这意味着什么?

我将不胜感激"Clustered Index Scan(Clustered)"的任何解释或有关在何处查找相关文档的建议?

Nee*_*rma 45

我将不胜感激"Clustered Index Scan(Clustered)"的任何解释

我将尝试以最简单的方式,以便更好地理解您需要了解索引搜索和扫描.

所以我们可以构建表格

use tempdb GO


create table scanseek  (id  int , name varchar(50) default ('some random names')  )

create clustered index IX_ID_scanseek on scanseek(ID)


declare @i int
SET @i = 0
while (@i <5000)
begin 
insert into scanseek
select @i, 'Name' + convert( varchar(5) ,@i)
set @i =@i+1
END
Run Code Online (Sandbox Code Playgroud)

索引查找是SQL服务器使用索引的b树结构直接查找匹配记录的位置

在此输入图像描述

您可以使用下面的DMV检查表根和叶节点

-- check index level 
SELECT 
index_level
,record_count
,page_count

,avg_record_size_in_bytes
FROM sys.dm_db_index_physical_stats(DB_ID('tempdb'),OBJECT_ID('scanseek'),NULL,NULL,'DETAILED')
GO
Run Code Online (Sandbox Code Playgroud)

现在我们在列"ID"上有聚簇索引

让我们寻找一些直接匹配的记录

select * from scanseek where id =340
Run Code Online (Sandbox Code Playgroud)

并查看执行计划

在此输入图像描述

您已在查询中直接请求了行,这就是您获得聚簇索引SEEK的原因.

聚簇索引扫描:当Sql server在聚簇索引中从上到下读取行时.例如,在非关键列中搜索数据.在我们的表中,NAME是非键列,因此如果我们将在name列中搜索某些数据,我们将看到,clustered index scan因为所有行都处于聚簇索引叶级别.

select * from scanseek where name = 'Name340'
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

请注意:我的答案简短,仅为了更好的理解,如果您有任何问题或建议请在下面评论.

  • HI @ChrisProsser如果你想了解更多关于索引的建议我建议你看看下面的2个链接:Gail Shaw的http://www.sqlservercentral.com/articles/Indexing/68563/和kimberly L Tripp https:// www.sqlskills.com/blogs/kimberly/category/clustered-index/, (2认同)

Mar*_*eke 5

在注释中扩展了Gordon的答案,聚簇索引扫描正在扫描其中一个表索引,以查找您正在执行where子句过滤的值,或者连接到查询计划中的下一个表.

表可以有多个索引(一个是聚簇的,一个是非聚簇的),SQL Server将根据正在执行的过滤器或连接搜索相应的索引.

在MSDN上很好地解释了聚簇索引.群集和非群集之间的关键区别在于聚簇索引定义了行在磁盘上的存储方式.

如果由于记录数量而导致聚簇索引的搜索成本非常高,则可能需要在表中为经常搜索的字段添加非聚集索引,例如用于筛选记录范围的日期字段.


Cur*_*urt 5

聚集索引是一种索引的终端(叶)节点是实际数据页本身的索引。每个表只能有一个聚集索引,因为它指定了记录在数据页中的排列方式。它通常(有一些例外)被认为是性能最好的索引类型(主要是因为在到达实际数据记录之前少了一层间接性)。

“聚集索引扫描”意味着 SQL 引擎正在遍历聚集索引以搜索特定值(或值集)。它是定位记录的最有效方法之一(优于“聚集索引查找”,其中 SQL 引擎寻找匹配单个选定值)。

该错误消息与查询计划完全无关。这只是意味着您的 TempDB 空间不足。

  • “这是查找记录的最有效方法之一”。如果从头到尾扫描索引,那么它是最“低效”的方法之一。 (2认同)