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)
请注意:我的答案简短,仅为了更好的理解,如果您有任何问题或建议请在下面评论.
聚集索引是一种索引的终端(叶)节点是实际数据页本身的索引。每个表只能有一个聚集索引,因为它指定了记录在数据页中的排列方式。它通常(有一些例外)被认为是性能最好的索引类型(主要是因为在到达实际数据记录之前少了一层间接性)。
“聚集索引扫描”意味着 SQL 引擎正在遍历聚集索引以搜索特定值(或值集)。它是定位记录的最有效方法之一(优于“聚集索引查找”,其中 SQL 引擎寻找匹配单个选定值)。
该错误消息与查询计划完全无关。这只是意味着您的 TempDB 空间不足。