"Clustered Index Scan (Clustered)" 在 SQL 服务器执行计划中意味着什么?
What "Clustered Index Scan (Clustered)" means on SQL Server execution plan?
我有一个无法使用 "Could not allocate a new page for database 'TEMPDB' because of insufficient disk space in filegroup 'DEFAULT'" 执行的查询。
在排错的路上我正在检查执行计划。有两个标记为 "Clustered Index Scan (Clustered)" 的昂贵步骤。我很难弄明白这是什么意思?
如果您能对 "Clustered Index Scan (Clustered)" 进行任何解释或提供有关在哪里可以找到相关文档的建议,我将不胜感激?
扩展 Gordon 在评论中的回答,聚簇索引扫描正在扫描 tables 索引之一以查找您正在执行 where 子句筛选器的值,或者连接到下一个 table 在你的查询计划中。
表可以有多个索引(一个集群索引和许多非集群索引),SQL服务器将根据正在执行的过滤器或连接搜索合适的索引。
Clustered Indexes 在 MSDN 上有很好的解释。聚簇索引和非聚簇索引之间的主要区别在于聚簇索引定义了行在磁盘上的存储方式。
如果您的聚簇索引由于记录的数量而导致搜索成本非常高,您可能希望在 table 上为您经常搜索的字段(例如日期字段)添加非聚簇索引用于过滤记录范围。
聚集索引是一种索引的终端(叶)节点是实际数据页本身的索引。每个 table 只能有一个聚簇索引,因为它指定了记录在数据页中的排列方式。它通常(除了一些例外)被认为是性能最高的索引类型(主要是因为在您到达实际数据记录之前有一个较少的间接级别)。
A "clustered index scan" 表示 SQL 引擎正在遍历您的聚簇索引以搜索特定值(或值集)。它是查找记录的最有效方法之一(被 "clustered index seek" 击败,其中 SQL 引擎正在寻找匹配单个选定值的方法)。
错误信息与查询计划完全无关。这只是意味着您在 TempDB 上 space。
I would appreciate any explanations to "Clustered Index Scan
(Clustered)"
我会尽量以最简单的方式进行介绍,为了更好地理解您需要同时了解索引查找和扫描。
所以让我们构建 table
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
索引查找是 SQL 服务器使用索引的 b-tree 结构直接查找匹配记录
您可以使用下面的 DMV 检查您的 table 根节点和叶节点
-- 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
现在我们在列 "ID"
上有聚簇索引
让我们寻找一些直接匹配的记录
select * from scanseek where id =340
并查看执行计划
您直接在查询中请求了行,这就是为什么您使用聚簇索引 SEEK 的原因。
聚簇索引扫描:当Sql服务器从聚簇索引中从上到下读取行时。
例如在非关键列中搜索数据。在我们的 table 中,NAME 是非键列,因此如果我们在名称列中搜索一些数据,我们将看到 clustered index scan
,因为所有行都在聚集索引叶级别。
示例
select * from scanseek where name = 'Name340'
请注意:为了更好地理解,我缩短了这个回答,如果您有任何问题或建议,请在下面评论。
如果将鼠标悬停在查询计划中的步骤上,SSMS 会显示该步骤的作用的描述。这将使您对 "Clustered Index Scan (Clustered)" 和所有其他涉及的步骤有一个基本的了解。
由于聚簇索引扫描,我一直遇到性能和超时问题。然而,另一个看似相同的数据库却没有同样的问题。
原来数据库上的 COMPATIBILITY_LEVEL 标志不同...... COMPATIBILITY_LEVEL 100 的版本正在使用扫描,而级别为 130 的数据库则没有。性能差异巨大(同一查询从超过 1 分钟到不到 1 秒)
改变数据库 [mydb] 设置 COMPATIBILITY_LEVEL = 130
我有一个无法使用 "Could not allocate a new page for database 'TEMPDB' because of insufficient disk space in filegroup 'DEFAULT'" 执行的查询。
在排错的路上我正在检查执行计划。有两个标记为 "Clustered Index Scan (Clustered)" 的昂贵步骤。我很难弄明白这是什么意思?
如果您能对 "Clustered Index Scan (Clustered)" 进行任何解释或提供有关在哪里可以找到相关文档的建议,我将不胜感激?
扩展 Gordon 在评论中的回答,聚簇索引扫描正在扫描 tables 索引之一以查找您正在执行 where 子句筛选器的值,或者连接到下一个 table 在你的查询计划中。
表可以有多个索引(一个集群索引和许多非集群索引),SQL服务器将根据正在执行的过滤器或连接搜索合适的索引。
Clustered Indexes 在 MSDN 上有很好的解释。聚簇索引和非聚簇索引之间的主要区别在于聚簇索引定义了行在磁盘上的存储方式。
如果您的聚簇索引由于记录的数量而导致搜索成本非常高,您可能希望在 table 上为您经常搜索的字段(例如日期字段)添加非聚簇索引用于过滤记录范围。
聚集索引是一种索引的终端(叶)节点是实际数据页本身的索引。每个 table 只能有一个聚簇索引,因为它指定了记录在数据页中的排列方式。它通常(除了一些例外)被认为是性能最高的索引类型(主要是因为在您到达实际数据记录之前有一个较少的间接级别)。
A "clustered index scan" 表示 SQL 引擎正在遍历您的聚簇索引以搜索特定值(或值集)。它是查找记录的最有效方法之一(被 "clustered index seek" 击败,其中 SQL 引擎正在寻找匹配单个选定值的方法)。
错误信息与查询计划完全无关。这只是意味着您在 TempDB 上 space。
I would appreciate any explanations to "Clustered Index Scan (Clustered)"
我会尽量以最简单的方式进行介绍,为了更好地理解您需要同时了解索引查找和扫描。
所以让我们构建 table
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
索引查找是 SQL 服务器使用索引的 b-tree 结构直接查找匹配记录
您可以使用下面的 DMV 检查您的 table 根节点和叶节点
-- 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
现在我们在列 "ID"
上有聚簇索引让我们寻找一些直接匹配的记录
select * from scanseek where id =340
并查看执行计划
您直接在查询中请求了行,这就是为什么您使用聚簇索引 SEEK 的原因。
聚簇索引扫描:当Sql服务器从聚簇索引中从上到下读取行时。
例如在非关键列中搜索数据。在我们的 table 中,NAME 是非键列,因此如果我们在名称列中搜索一些数据,我们将看到 clustered index scan
,因为所有行都在聚集索引叶级别。
示例
select * from scanseek where name = 'Name340'
请注意:为了更好地理解,我缩短了这个回答,如果您有任何问题或建议,请在下面评论。
如果将鼠标悬停在查询计划中的步骤上,SSMS 会显示该步骤的作用的描述。这将使您对 "Clustered Index Scan (Clustered)" 和所有其他涉及的步骤有一个基本的了解。
由于聚簇索引扫描,我一直遇到性能和超时问题。然而,另一个看似相同的数据库却没有同样的问题。 原来数据库上的 COMPATIBILITY_LEVEL 标志不同...... COMPATIBILITY_LEVEL 100 的版本正在使用扫描,而级别为 130 的数据库则没有。性能差异巨大(同一查询从超过 1 分钟到不到 1 秒)
改变数据库 [mydb] 设置 COMPATIBILITY_LEVEL = 130