例如:
hr@ORCL> desc t Name Null? Type ----------------------------------------------------- -------- ------------------------------------ EMPNO NOT NULL NUMBER SEX NOT NULL VARCHAR2(4) ENAME VARCHAR2(4) hr@ORCL> create index sex_empno on t (sex,empno); Index created. hr@ORCL> analyze index sex_empno compute statistics; Index analyzed. hr@ORCL> select /*+ index_ss(t) */ empno from t where empno=8; Execution Plan ---------------------------------------------------------- Plan hash value: 3008009344 ------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 1 | 10 | 3 (0)| 00:00:01 | |* 1 | INDEX SKIP SCAN | SEX_EMPNO | 1 | 10 | 3 (0)| 00:00:01 | ------------------------------------------------------------------------------
先看个图:

假如我现在要查找employee_id是109的记录,从图可以看出来,109的记录存在与块3和块5上
但是skip scan是通过什么样的方式定位到这两个块呢?
ORACLE可以在SKIP SCAN中,选择相应的入口后,通过根节点和分支节点的信息,非常精准的定位到记录的叶子块,即块3和块5.
如果要查找employee_id为109的条目,ORACLE进入到入口M后,直接就可以定位到块3.而不需要扫描块1和块2.
进入到入口F后,直接就可以定位到块5,而不需要扫描块4和块6
那么,我们上面这条查询,经过skip scan后,内部可能是:
select empno from t where sex=\'M\' and empno=8
union
select empno from t where sex=\'F\' and empno=8;
我们可以想象,如果索引前导列的唯一值很多,那么势必会大大削弱skip scan的效能,因为可能存在很多union
有时候为了避免index skip scan,建立新的索引是有必要的
㈡ INDEX Range Scan
INDEX Range SCAN是一种很常见的表访问方式
在INDEX Range SCAN中,Oracle访问毗邻的索引条目,然后根据索引里面的rowid去检索表的记录
例如:查询范围为80号部门里的所有员工
hr@ORCL> select JOB_ID,FIRST_NAME from employees where DEPARTMENT_ID=80; Execution Plan ---------------------------------------------------------- Plan hash value: 2056577954 ------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 34 | 646 | 4 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| EMPLOYEES | 34 | 646 | 4 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | EMP_DEPARTMENT_IX | 34 | | 1 (0)| 00:00:01 | -------------------------------------------------------------------------------------------------
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26515977/viewspace-1207975/ ,如需转载,请注明出处,否则将追究法律责任。