我希望对“聚集索引扫描”有任何解释
(聚集)”
我将尝试以最简单的方式表达,为了更好地理解,您需要了解索引查找和扫描。
所以让我们建表
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 Server 使用的地方b-tree https://en.wikipedia.org/wiki/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服务器从上到下读取聚集索引中的行时。
例如在非关键列中搜索数据。在我们的表中 NAME 是非键列,因此如果我们在名称列中搜索一些数据,我们将看到clustered index scan
因为所有行都位于聚集索引叶级别。
Example
select * from scanseek where name = 'Name340'
请注意:我简短地回答了这个问题,只是为了更好地理解,如果您有任何问题或建议,请在下面评论。