【索引】索引全扫描和索引快速全扫描的区别

索引快速全扫描
实际上,对于一个仅仅引用索引中一部分列的查询来说,oracle会把索引看作一个包含一些混合无用数据的很小的表(比如存储的一些rowid和无意义的分支块)
这就意味着oracle能够按照物理块顺序来读取索引段,并使用多块读取,在读取的同时抛弃分支块(意思就是不得走叶子节点间的链表,而直接挨着读取磁盘上的下一个叶子块)。
所以索引记录将不会按照索引顺序返回,这是因为oracle不会按照常用的指针那样从一个叶块转移到另一个叶块;
但是,理论上,能够从磁盘上快速的获取数据,这一点带来的好处最终抵消任何排序导致的成本。


意思就是扫描叶子节点时 不得走链表
所以我就不明白了  oracle怎么知道扫描了 所有的叶子块呢  这个边界问题怎么确定的呢?
难道不需要扫描所有的叶子块???


索引快速扫描(FFS)跟索引全扫描一样也是扫描索引块,但是不同在于FFS单块读取索引段头(segment header,一个段的hwm就存储在段头中)中的hwm信息,然后
开始多块读HWM以下的所有根块、枝块、叶块,所以通过FFS读出来的数据读取顺序是由物理存储位置决定的、无序的。


而索引全扫描不会读取段头(segment header),index full scan , 扫描root block ---> branch block ----> leaf block ,扫描leaf block的时候是有序的,可以
从左往右,也可以从右往左,返回的结果也是有序的,并且是单块读。index full scan什么能不通过segment header就能找到root block?答:数据字典中获得。


当进行index full scan的时候 oracle定位到索引的root block,然后到branch block(如果有的话),再定位到第一个leaf block, 然后根据leaf block的双向链表顺序读取。
它所读取的块都是有顺序的,也是经过排序的。而index fast full scan则不同,它是从段头开始,读取包含位图块,root block, 所有的branch block, leaf block,读取
的顺序完全有物理存储位置决定,并采取多块读,每次读取db_file_multiblock_read_count个。


总结,所以:

1. 索引全扫描要排序,索引快速全扫描不得排序(应该将为索引全扫描会按照叶子块排序返回,而索引快速全扫描则是按照索引段内存储块顺序返回)。

2. 索引全扫描不得读取索引段头,而索引快速全扫描要读取索引段头。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值