oracle索引连续性,深入理解Oracle索引(1):INDEXSKIPSCAN和INDEXRANGESCAN-Oracle

——————————————————————————

先看个图:

VJRBZb.png

假如我现在要查找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号部门里的所有员工

[sql] view plain copy print?

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 |

————————————————————————————————-

INDEX RANGE SCAN是范围扫描,举个例子,有1到100,分5个范围,要查询45就要到第3的范围里查,这样会很快

Index Unique Scan和Index Range Scan在B Tree上的搜索路径是一样的

只是Index Unique Scan在找到应该含有要找的Index Key的block后便停止了搜索,因为该键是唯一的

而Index Range Scan还要循着指针继续找下去直到条件不满足时

并且,Index Range Scan只是索引上的查询,与是否扫描表没有关系

如果所选择的列都在index上就不用去scan table

如果扫描到表, 必然还有一个table access by rowid,正如上例所展示的

通过index range scan访问的表可以通过按照索引顺序重新建立表来提高效率

原因有二:

① 如果你只读一部分数据,假设20% ,如果表数据顺序混乱,实际上可能把整个表都读进来了

如果表顺序和索引一致,则只需要读进 20%的表的block就够了。这是简单情况

② 复杂情况下,顺序混乱的时候 block 可能在整个查询的不同时间点多次反复访问

当再次要访问这个块的时候说不定已经被换出去了,或者被修改过了,那代价更大

而如果顺序一样,对同一个block的访问集中在一段连续的很短的时间内,变数少,不会对同一个block产生多次IO

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值