访问数据的方法

来源:互联网 发布:log4j 输出sql语句 编辑:程序博客网 时间:2024/05/16 19:45

Oracle访问表中数据的方法有两种:一种是直接访问表;另一种是先访问索引,再回表(当然,如果目标SQL所要访问的数据只通过访问相关的索引就可以得到,那么此时就不需要再回表了)。


一:访问表的方法

Oracle 中访问表中数据的方法有两种:一种是全表扫描;另一种是ROWID扫描。

1: 全表扫描 (Full Table Scan)

全表扫描是指Oracle在访问目标表的数据时,会从该表所占用的第一个区(EXTENT)的第一个块(BLOCK)开始扫描,一直扫描到该表的高水位线(HWM, High Water Mark), 这段范围内所有的数据块Oracle都必须读到。当然Oracle会对这期间读到的所有数据实加目标SQL的where条件中指定的过滤条件,最后只返回那些满足过滤条件的数据。


全表扫描最大的问题在于走全表扫描的目标SQL的执行时间会不稳定,不可控,这个执行时间一定会随着目标表数据量的递增而递增。


高水位线的这种特性带来的副作用是:即使使用了DELETE语句删光了目标表中的所有数据,高水位线还是会在原来的位置,这意味着全表扫描时Oracle还是需要扫描该高水位下的所有数据块,所以此时对该表的全表扫描操作所耗费的时间与之前相比并不会有明显的改观。


2:ROWID扫描

ROWID扫描是指Oracle在访问目标表里的数据时,直接通过数据所在的ROWID去定位并访问这些数据。ROWID表示的是Oracle中的数据行记录所在的物理存储地址,也就是说ROWID实际上是和Oracle中数据块里的行记录一一对应的。



二:访问索引的方法

如下图是B数索引的结构图。


通过走索引访问数据的时间是可控的,基本稳定的,这也是走索引和全表扫描的最大区别。


1:索引唯一性扫描 (INDEX UNIQUE SCAN)

适用于where条件里是等值查询的目标SQL。

2:索引范围扫描(INDEX RANGE SCAN)

索引范围扫描的结果可能会返回多条记录。

3:索引全扫描(INDEX FULL SCAN)

索引全扫描就是指要扫描目标索引所有叶子块的所有索引行。

默认会排序,适用于ORDER BY SQL

4:索引快速扫描(INDEX FAST FULL SCAN)

适用于GROUP BY SQL

5:  索引跳跃式扫描(INDEX SKIP SCAN)

它使那些在WHERE条件中没有对目标索引的前导列指定查询条件但同时又对该索引的非前导列指定了查询条件的目标SQL依然可以用上该索引,这就像是在扫描该索引时跳过了它的前导列,直接从该索引的非前导列开始扫描一样。

Oracle中的索引跳跃式扫描仅仅适用于那些目标索引前导列的DISTINCT值数量较少的情形,因为索引跳跃式扫描的执行效率一定会随着目标索引前导列的DISTINCT值数量的递增而递减。

0 0