oracle 索引访问方式

一. 概述

 

           index unique scan(唯一性索引扫描):返回一个唯一rowid,只有当这个索引的唯一性索引,且我们用等于号作为条件的时候。比如:我们在id上设了一个唯一性索引,SQL语句的条件部分为:where id='123'。那么就会使用唯一性索引扫描,返回一个rowid,然后根据这个rowid去访问数据。

 

         index range scan(索引范围扫描): 返回多于一个rowid,比如:我们在name列上设置一个普通索引,SQL语句的条件部分为where name like ‘liwsh%’。那么就会使用索引范围扫描,从第一个name以liwsh打头的数据开始往后扫描,找到所有name以liwsh打头的rowid. 

 

         index full scan(全表索引扫描):就是遍历这个索引上每一个值,条件是select和where里面的字段都存在于这个索引里面(什么意思呢,就是我们不需要通过索引获取rowid再去读取真正的数据,我们可以在索引里面就得到我们要的数据)。这种扫描方式返回的数据是顺序的,因为是沿着索引的顺序一个一个读取的。因此,这种扫描方式不支持一次读取多个块。我们知道full table scan(全表扫描)支持一次读取多个块。那么,如果查询优化器选择这种扫描方式而不是全表扫描,表明这样扫描更廉价。(另外,这个索引里面必须有一个字段是非空的,在表定义的时候,是非空的。因为索引不存放空值,如果存在空值,就会漏掉。)

 

         index fast full scan(全表索引快速扫描):这种扫描方式支持一次读取多个块与并行读取。因此它返回的数据是无序的。条件跟index full scan一样,查询需要的数据在索引里面就能找到,查询的条件有索引支持。比如:select count(*)一般使用的就是这种扫描方式,如果有order by 字样,那么很有可能就是使用index full scan,因为它返回的数据是有序的。

 

        index skip scan(跳跃式索引扫描):比如我们建立一个复合索引在(sex,employee_id)上面,如果我们执行如下查询,select * from employee where employee_id='101'. 将有可能会是跳跃式索引扫描(在索引前导列sex不同值很少的时候)。这个时候,会根据sex的不同值分成几个区,每一个区再根据employee_id进行跳跃式扫描。如果sex列不同值非常多,那就会是进行全表扫描了,不会走索引了。(返回的是rowid,只有那两种full scan返回的直接就是值)

 

        

猜你喜欢

转载自liwenshui322.iteye.com/blog/1915263