索引快速全扫描
实际上,对于一个仅仅引用索引中一部分列的查询来说,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. 索引全扫描不得读取索引段头,而索引快速全扫描要读取索引段头。
实际上,对于一个仅仅引用索引中一部分列的查询来说,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. 索引全扫描不得读取索引段头,而索引快速全扫描要读取索引段头。