【问题标题】:What "Clustered Index Scan (Clustered)" means on SQL Server execution plan?SQL Server 执行计划中的“Clustered Index Scan (Clustered)”是什么意思?
【发布时间】:2015-11-04 03:01:58
【问题描述】:

我的查询无法执行,并显示“由于文件组 'DEFAULT' 中的磁盘空间不足,无法为数据库 'TEMPDB' 分配新页面”。

在排除故障的过程中,我正在检查执行计划。有两个代价高昂的步骤标记为“Clustered Index Scan (Clustered)”。我很难弄清楚这意味着什么?

如果对“Clustered Index Scan (Clustered)”有任何解释或关于在哪里可以找到相关文档的建议,我将不胜感激?

【问题讨论】:

  • 聚集索引扫描本质上是扫描表。它可能从某个特定的主键值开始,然后上升到另一个。
  • 为了解决更大的问题...请注意错误消息中“磁盘空间不足”的部分。
  • 为了清楚起见,扫描不需要 tempdb。其他东西正在使用它,我的猜测是排序或散列连接溢出到 tempdb 或计划中有一个假脱机(假设这仍然是一个没有分组等的简单选择)。

标签: sql sql-server sql-execution-plan


【解决方案1】:

我将不胜感激对“聚集索引扫描”的任何解释 (集群)”

我将尝试以最简单的方式进行说明,为了更好地理解,您需要同时了解索引查找和扫描。

所以让我们建表

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 检查您的表根节点和叶节点

-- 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 server 从上到下读取聚集索引中的 Row(s) 时。 例如在非关键列中搜索数据。在我们的表中,NAME 是非键列,因此如果我们在 name 列中搜索一些数据,我们将看到 clustered index scan,因为所有行都在聚集索引叶级。

例子

select * from scanseek where name = 'Name340'

请注意:我只是为了更好地理解而简短回答,如果您有任何问题或建议,请在下方评论。

【讨论】:

【解决方案2】:

在 cmets 中扩展 Gordon 的答案,聚集索引扫描正在扫描其中一个表索引以查找您正在执行 where 子句过滤器的值,或连接到查询计划中的下一个表。

表可以有多个索引(一个集群索引和多个非集群索引),SQL Server 将根据正在执行的过滤器或连接搜索适当的索引。

Clustered Indexes 在 MSDN 上有很好的解释。聚集索引和非聚集索引的主要区别在于聚集索引定义了行在磁盘上的存储方式。

如果您的聚集索引由于记录数而搜索起来非常昂贵,您可能希望在表上为您经常搜索的字段添加一个非聚集索引,例如用于过滤记录范围的日期字段.

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      由于聚集索引扫描,我遇到了性能和超时问题。然而,另一个看似相同的数据库却没有同样的问题。 结果发现数据库上的 COMPATIBILITY_LEVEL 标志不同...... COMPATIBILITY_LEVEL 100 的版本正在使用扫描,而级别 130 的数据库则没有。性能差异巨大(同一查询从超过 1 分钟到不到 1 秒)

      ALTER DATABASE [mydb] SET COMPATIBILITY_LEVEL = 130

      【讨论】:

        【解决方案5】:

        如果您将鼠标悬停在查询计划中的步骤上,SSMS 会显示该步骤的功能描述。这将使您对“Clustered Index Scan (Clustered)”和所涉及的所有其他步骤有一个基本的了解。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-25
          • 1970-01-01
          • 2017-08-10
          相关资源
          最近更新 更多