首页 > Oracle > Oracle 常见的几种访问提取数据的方式!
2014
01-23

Oracle 常见的几种访问提取数据的方式!

oracle中常见的几种提取数据的方式可以分为三大类:全表扫描,通过rowid访问和索引扫描。下面先看一下全表扫描。

1.table full scan全表扫描:这个应该是平时工作中比较常见,一般在返回数据量比较大的情况出现,其扫描方式就是扫描区,根据extent读取数据,因为一个区包含的是block,索引全表扫描属于多快读。

2.index unique scan索引唯一扫描:根据名字就可以猜到这种扫描方式只会发生在primary key或者unique key的索引等值查找上,索引唯一扫描属于单块读,sql会根据条件判断自动走这种扫描方式,一般返回一条记录,所以基本上不会有db file sequential read这种类型的等待事件发生。

3.index range scan索引范围扫描:这种扫描方式和index unique scan扫描方式有点类似,发生在对unique key或者primary key的索引范围查找的情况,这点和index unique scan扫描方式的等值查找有区别,此外还会发生在non-unique index的等值情况,范围查找的情况下,可以手动hint走这个扫描方式:index(表名 索引名)。

4.index skip scan索引跳跃扫描:这种扫描方式只会发生在组合索引上,也属于单块读,一般出现在引导列(组合索引的第一列)没有包含在where条件中,而且引导列基数比较低,这种扫描方式一般返回的数据量相对较少,可以手动hint指定扫描方式:index_ss(表名 索引名)。

5.index full scan索引全扫描:通常发生在如下几种情况,但是并不一定会走这种扫描方式:1.sql中有order by排序,且order by的列都包含在索引中,且顺序一致。2.在sort merge join的时候,如果要查询的列可以通过索引获得,那就没有必要全表扫描,而且index full scan返回的结果是已经排序了的结果。3.当查询中有group by,且group by的列都包含在索引中。当然这种扫描方式也是单块读,但是扫描的结果是排序后的结果。可以用hint指定扫描方式:index(表面 索引名)。

6.index fast full scan索引快速全扫描:这种扫描方式和上面几种扫描方式不一致,这种扫描方式属于多快读,当sql返回的数据直接从索引就可以完全获取,那oracle就不会走全表扫描了,直接就回走索引快速全扫描,这种方式有点 类似全表扫描,也是一个区一个区的扫描,和全表扫描一样,结果不会排序。可以用hint指定扫描方式:index_ffs(表名 索引名)。

7.index range scan descending索引降序范围扫描:这种方式和index range scan一样,只不过是按照降序扫描,因为索引默认是按照升序排列的,当遇到order by desc的时候,可能就会进行降序范围扫描,一般在分页当中比较多,当然和index range scan一样的是,这种扫描方式也属于单块读。可用hint指定扫描方式:index_desc(表名 索引名)。

8.index full scan(max/min)索引最大/最小扫描:这种扫描方式一般发生在select max(xxxx)或者select min(xxxx)中,并且xxxx列上有索引才会选择这种扫描方式,也属于单块读,sql自动判断是否该用这种扫描方式。

9.mat_view rewrite access full物化视图全表扫描:物化视图机制就相当于表,所以这种扫描方式属于多快读,一般出现在sql可以从物化视图中直接获取结果,就会走物化视图扫描这种方式。

当然还有其他特殊的数据扫描方式,这里就不一一举例了,在以后在案列中,会介绍这些扫描方式的差别。

最后编辑:
作者:Jerry
一个积极向上的小青年,热衷于分享--Focus on DB,BI,ETL