oracle的数据扫描方式

来源:互联网 发布:优斗士网络推广效果 编辑:程序博客网 时间:2024/04/30 16:23

最近这段时间刚好有点空余的小时间 就索性研究了下oracle的数据扫面方式,由于个人经验原因一般 顾博客内容仅供参考


总的来说 我们通常查询数据的话有以下几种方式---表扫面 和索引扫描

一、表扫描方式

1、全表扫描 (FULL TABLE SCAN)

2、通过ROWID的表存取(Table Access by ROWID )


二、索引扫描方式

1、索引唯一扫描(index unique scan)  (oracle建表时会自动建的ID索引) 

例如 :select * from 表名 where id=? 时 就会触发 此扫描


2、索引范围扫描(index range scan)

就是表中的字段 除id外 我们手动建的索引 (默认已经建立字段1的索引 非id索引)

例如 : select  *  from  表名 where 字段1=?  


3、索引快速全扫描(index fast full scan) (默认id索引和字段1索引以建立)

当select 字段和where后面的条件查询字段都出现在索引列里面的时候 这时就会触发索引快速全扫描

例如: select w.字段1 from 表名 w where id=? 


4、索引跳跃扫描(在组合索引场景中出现)---通俗点就是 查询条件含有索引非引导列且 索引引导列的唯一值即count(distinct 引导字段)相对比较下时

,当谓语中包含索引中非引导列上的条件,并且引导列的唯一值较小的时候,就有极有可能使用索引跳跃扫描方法;同索引全扫描,范围扫描一样,它也可以升序或降序的访问索引;不同的是跳跃扫描会根据引导列的唯一值数目将复合索引分成多个较小的逻辑子索引,引导列的唯一值数目越小,分割的子索引数目也就越少,就越可能达到相对全表扫描较高的运算效率。

  


另外附上index fast full scan(结果集无序)和index full scan(结果集有序)比较

  • 当select和where中出现的列都存在索引是发生index full scan与index fast full scan的前提
  • index fast full scan使用多块读的方式读取索引块,产生db file scattered reads 事件,读取时高效,但为无序读取
  • index full scan使用单块读方式有序读取索引块,产生db file sequential reads事件,当采用该方式读取大量索引全扫描,效率低下
并且索引用久了之后会产生索引碎片 ,影响查询效率 需要删掉重新建立索引


阅读全文
1 0
原创粉丝点击