社区
MS-SQL Server
帖子详情
Clustered Index Scan與Clunstered Index Seek
jason_lu
2007-11-28 04:30:58
各位高手,小弟有個疑問
執行計劃中的Clustered Index Scan與Clunstered Index Seek有什麼分別?
...全文
470
6
打赏
收藏
Clustered Index Scan與Clunstered Index Seek
各位高手,小弟有個疑問 執行計劃中的Clustered Index Scan與Clunstered Index Seek有什麼分別?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
w2jc
2007-12-05
打赏
举报
回复
保存
这些细节对优化查询很有用处!
rouqu
2007-12-05
打赏
举报
回复
B 树、 B- 树、 B+ 树、 B* 树都是什么 [
ZT
]
B 树 即二叉搜索树:
1. 所有非叶子结点至多拥有两个儿子( Left 和 Right );
2. 所有结点存储一个关键字;
3. 非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;
B 树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键字大,就进入右儿子;如果左儿子或右儿子的指针为空,则报告找不到相应的关键字;
如果 B 树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么 B 树的搜索性能逼近二分查找;但它比连续内存空间的二分查找的优点是,改变 B 树结构(插入与删除结点)不需要移动大段的内存数据,甚至通常是常数开销;
但 B 树在经过多次插入与删除后,有可能导致不同的结构:
右边也是一个 B 树,但它的搜索性能已经是线性的了;同样的关键字集合有可能导致不同的树结构索引;所以,使用 B 树还要考虑尽可能让 B 树保持左图的结构,和避免右图的结构,也就是所谓的“平衡”问题;
实际使用的 B 树都是在原 B 树的基础上加上平衡算法,即“平衡二叉树”;如何保持 B 树结点分布均匀的平衡算法是平衡二叉树的关键;平衡算法是一种在 B 树中插入和删除结点的策略;
B- 树
是一种多路搜索树(并不是二叉的):
1. 定义任意非叶子结点最多只有 M 个儿子;且 M>2 ;
2. 根结点的儿子数为 [2, M] ;
3. 除根结点以外的非叶子结点的儿子数为 [M/2, M] ;
4. 每个结点存放至少 M/2-1 (取上整)和至多 M-1 个关键字;(至少 2 个关键字)
5. 非叶子结点的关键字个数 = 指向儿子的指针个数 -1 ;
6. 非叶子结点的关键字: K[1], K[2], …, K[M-1] ;且 K < K[i+1] ;
7. 非叶子结点的指针: P[1], P[2], …, P[M] ;其中 P[1] 指向关键字小于 K[1] 的子树, P[M] 指向关键字大于 K[M-1] 的子树,其它 P 指向关键字属于 (K[i-1], K) 的子树;
8. 所有叶子结点位于同一层;
如:( M=3 )
B- 树的搜索,从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的儿子结点;重复,直到所对应的儿子指针为空,或已经是叶子结点;
B- 树的特性:
1. 关键字集合分布在整颗树中;
2. 任何一个关键字出现且只出现在一个结点中;
3. 搜索有可能在非叶子结点结束;
4. 其搜索性能等价于在关键字全集内做一次二分查找;
5. 自动层次控制;
由于限制了除根结点以外的非叶子结点,至少含有 M/2 个儿子,确保了结点的至少利用率,其最底搜索性能为:
其中, M 为设定的非叶子结点最多子树个数, N 为关键字总数;
所以 B- 树的性能总是等价于二分查找(与 M 值无关),也就没有 B 树平衡的问题;
由于 M/2 的限制,在插入结点时,如果结点已满,需要将结点分裂为两个各占 M/2 的结点;删除结点时,需将两个不足 M/2 的兄弟结点合并;
B+ 树
B+ 树是 B- 树的变体,也是一种多路搜索树:
1. 其定义基本与 B- 树同,除了:
2. 非叶子结点的子树指针与关键字个数相同;
3. 非叶子结点的子树指针 P ,指向关键字值属于 [K, K[i+1]) 的子树( B- 树是开区间);
5. 为所有叶子结点增加一个链指针;
6. 所有关键字都在叶子结点出现;
如:( M=3 )
B+ 的搜索与 B- 树也基本相同,区别是 B+ 树只有达到叶子结点才命中( B- 树可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;
B+ 的特性:
1. 所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;
2. 不可能在非叶子结点命中;
3. 非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;
4. 更适合文件索引系统;
B* 树
是 B+ 树的变体,在 B+ 树的非根和非叶子结点再增加指向兄弟的指针;
B* 树定义了非叶子结点关键字个数至少为 (2/3)*M ,即块的最低使用率为 2/3 (代替 B+ 树的 1/2 );
B+ 树的分裂:当一个结点满时,分配一个新的结点,并将原结点中 1/2 的数据复制到新结点,最后在父结点中增加新结点的指针; B+ 树的分裂只影响原结点和父结点,而不会影响兄弟结点,所以它不需要指向兄弟的指针;
B* 树的分裂:当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分数据移到兄弟结点中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字(因为兄弟结点的关键字范围改变了);如果兄弟也满了,则在原结点与兄弟结点之间增加新结点,并各复制 1/3 的数据到新结点,最后在父结点增加新结点的指针;
所以, B* 树分配新结点的概率比 B+ 树要低,空间使用率更高;
B 树:二叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于走右结点;
B- 树:多路搜索树,每个结点存储 M/2 到 M 个关键字,非叶子结点存储指向关键字范围的子结点;
所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;
B+ 树:在 B- 树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引; B+ 树总是到叶子结点才命中;
B* 树:在 B+ 树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从 1/2 提高到 2/3
rouqu
2007-12-05
打赏
举报
回复
比如 你那索引列做连接条件和别的表join 应该是scan 如果做where 索引列>='xx'就做seek
rouqu
2007-12-05
打赏
举报
回复
scan是索引扫描 也就是遍历B树 seek是B树查找
luoqun_ncs
2007-12-05
打赏
举报
回复
index scan多半是出现在索引列在表达式中.数据库引擎无法直接确定你要的列的值,所以只能扫描整个整个索引进行计算.
index seek就要好很多.数据库引擎只需要扫描几个分支节点就可以定位到你要的记录.
回过来,因为你提到的是Clustered Index Scan.聚集索引的叶子节点就是记录.所以Clustered Index Scan就基本等同于full table scan.
puremoon2008
2007-12-05
打赏
举报
回复
http://www.51cto.com/art/200704/44253.htm
Clus
tere
d
Index
Scan 与
Clus
tere
d
Index
Seek
Clus
tere
d
Index
Scan 与
Clus
tere
d
Index
Seek
在利用 SQL Server 查询分析器的执行计划中,会有许多扫描方式,其中就有
Clus
tere
d
Index
Scan 与
Clus
tere
d
Index
Seek
,这二者有什么区别呢?
Clus
tere
d
Index
,为聚集索引,表示它们使用的都是聚集索引扫描。 Scan 表示它扫描一个范围或者...
Clus
tere
d
Index
Scan and
Clus
tere
d
Index
Seek
Clus
tere
d
Index
Scan and
Clus
tere
d
Index
Seek
for
Clus
tere
d
Index
:
Index
Seek
means that SQL Server will ...
sql server中
clus
tere
d
index
scan,table scan,
index
scan
这里就要将的是table scan,
index
scan以及
index
seek
. A table scan is where the table is processed row by row from beginning to end.An
index
scan is where the
index
is processed row by row from beginning to en
实战:看懂并分析执行计划——
Clus
tere
d
Index
Scan
通过查看执行计划中的操作,我们可以确认查询的瓶颈在于全表扫描导致了大量 I/O 和 CPU 开销。针对Predicate中使用的条件列创建合适的非聚集索引,以及减少中不必要的字段,可以有效优化查询性能,减少 I/O 和 CPU 消耗。创建索引后,重新查看执行计划,以确认是否成功将转换为
Index
Seek
,达到优化目标。
查询计划中的扫描和查找效率比较说明
1.
Index
Seek
(索引查找) :索引查找意味着查询优化器使用了数据表上的非聚集索引来查找数据。 性能通常会很快,尤其是当只有少数的数据行被返回时。 2.
Clus
tere
d
Index
Seek
:聚集索引查找。这指查询优化器使用了数据表上的聚集索引来查找数据,性能很快。 3.
Clus
tere
d Inde
MS-SQL Server
34,837
社区成员
254,632
社区内容
发帖
与我相关
我的任务
MS-SQL Server
MS-SQL Server相关内容讨论专区
复制链接
扫一扫
分享
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章