回答

收藏

SQL Server群集索引扫描(群集)是什么意思?

技术问答 技术问答 557 人阅读 | 0 人回复 | 2023-09-14

我有一个查询无法执行,因为因为文件组’DEFAULT’数据库中磁盘空间不足’TEMPDB’分配新页面”。1 [# @* Q8 z1 X* |. L7 r
在排除故障的过程中,我正在检查执行计划。有两个昂贵的步骤标记为聚集索引扫描(聚集)。我很难找出这意味着什么?
8 p# x, \+ w7 Z0 E我非常感谢群组索引扫描(群组)的任何解释或在哪里可以找到相关文件的建议。. M1 V" z" V% @$ @; }: U) x
                                                                ! t7 p8 U! W1 a* l
    解决方案:                                                               
0 l2 {" F' F- _) g8 G" Z( e6 K                                                                我将非常感谢对群组索引扫描(群组)的任何解释。
$ S% }( @9 g+ R  {+ W为了更好地理解你需要同时理解索引搜索和扫描,我将尝试以最简单的方式进行介绍。
9 M& [/ }. o$ o/ Q所以让我们建立一个表格* b3 ~# k) v# Z" W( b
use tempdb GOcreate table scanseek  (id  int ,name varchar(50) default ('some random names')  )create clustered index IX_ID_scanseek on scanseek(ID)declare @i intSET @i = 0while (@i 索引查找是SQL Server使用索引的b树结构直接找到匹配记录的地方
" c4 I* r. {) g3 o; Q
5 \3 ]( C& d" a% W; f8 c* q2 Y您可以使用以下内容DMV根节点和叶节点检查表# b* }8 n- O% S$ X' `: Y
-- check index level SELECT index_level,record_count,page_count,avg_record_size_in_bytesFROM sys.dm_db_index_physical_stats(DB_ID('tempdb'),OBJECT_ID('scanseek'),NULL,NULL,'DETAILED')GO现在,我们在 ID在列表中建立了聚集索引
4 V) G+ v) Y& p+ T% ^* ^让我们找到一些直接匹配的记录
9 u! I3 M0 t/ N* tselect * from scanseek where id =340看看执行计划
1 g( ^$ L" ~2 x1 r5 e$ [' z$ q4 I. w/ E) f
您直接在查询中要求行,这就是为什么获得聚簇索引SEEK的原因。
, a0 _  r7 d' p' H1 f6 b$ k0 M/ h6 G收集索引扫描:    当Sql( y" l8 X: s" F6 T) n: ?
Server从收集索引的顶部到底部读取行。例如,在非关键列中搜索数据。在我们的表中NAME是非关键列,所以如果我们在name在列中搜索一些数据,就会看到,clusteredindex scan因为所有的行都在聚簇索引叶的级别。
; g- k# |1 U0 t7 g8 m例子2 P# r; R. X- ^8 w* F. `
select * from scanseek where name = 'Name340'( @; {# ?6 V3 `+ Z& T+ s$ r( J0 I
6 k. F$ M# l! W$ O4 e( d" J4 u) h4 k
请注意:我把这个答案简写为只是为了更好的理解。如果您有任何问题或建议,请在下面发表评论。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则