索引范围扫描
当谓语中包含将会返回一定范围数据的条件时就会选用索引范围扫描。
索引可以是唯一或者不唯一的, 因为是由该条件来确定是否返回多个数据行的。
INDEX RANGE SCAN 索引范围扫描。单块读 发生在对unique index/primary key 进行范围查找,
对non-unique index进行等值查找,范围查找
等待事件:db file sequential read 如果你监控某个SQL出现大量该等待事件,
有可能执行计划就有问题
所指定的条件可以使用诸如 <,> like ,between, 甚至是=等运算符
SQL> select * from employees where department_id='60';
Execution Plan
----------------------------------------------------------
Plan hash value: 2056577954
-------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 665 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| EMPLOYEES | 5 | 665 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | EMP_DEPARTMENT_IX | 5 | | 1 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("DEPARTMENT_ID"=60)
Note
-----
- dynamic sampling used for this statement
范围扫描将会从根数据块开始到第一个包含符合特定条件的条目所在的叶子块来遍历索引结构。
再从那一点开始,从索引条目中取出一个行编号然后取出相应的表数据块(通过索引行编号访问数据表)
在第一行被取出来之后,之前的叶子索引块将再一次被访问并读取下一个索引条目来获取下一个行编号。
这种索引叶子块之间的反复来回将会不断持续直到所有匹配的索引都被读出。
因此,所需访问数据块的次数将包含索引中的分支块数(可以通过索引的blevel统计信息得出)
加上符合条件的索引条目数乘以2.
必须乘以2是因为每取出表中返回5行数据并且blevel为3,则总的需要访问的数据块次数将是 (5行 * 2) + 3=13
当返回5条记录时,需要访问13个块(索引块和表块),那是不是当访问记录达到一定程度时,索引访问的块数就接近了全表扫描的块数,
而且index range scan是单块读,全表扫描是多块读,那此时全表扫描的效率就会高于索引扫描。