关于Oralce三种访问路径

来源:互联网 发布:web关联数据库 编辑:程序博客网 时间:2024/06/05 17:27

A. 全表扫描  (FULL TABLE SCANS)
B.ROWID扫描 (ROWID SCANS)

ROWID扫描(ROWID SCANS)是通过ROWID中数据文件和块位置访问数据行。一般作为访问索引后的第二步,如果访问的列全部包含在索引中,则不会执行ROWID扫描。


C.索引扫描(INDEX SCANS)
全索引扫描(full index scan、FIS)

逐一读取索引中的所有块,由于索引中数据已按索引键排序,因此会忽略掉排序,可能发生的情况如下:
A. ORDER BY中的列全部在某个索引中
B. ORDER BY中列的顺序满足索引中前导列的顺序时
C. 使用GROUP BY且该子句中的列在索引中时

快速全索引扫描(fast full index scan、FFIS):
只扫描索引中的数据,不会扫描表中的数据;由于索引中数据未按索引键排序,因此不能忽略掉排序。当同时满足下列条件时,Oracle用FFIS替代FIS或FTS:
1.查询的所有列均包含在索引中
2.索引中的列至少一个具有not null约束(10g开始的,原低版本的系统中为查询的列中不包含任何null值)


索引范围扫描(index range scan):

索引范围扫描是访问选择性数据最常用的扫描方式;按顺序的对某个索引进行扫描,返回数据是升序排列的,可以使用唯一索引和非唯一索引;如果对索引列使用ORDER BY/GROUP BY则可省略排序。
下列情形中会发生索引范围扫描:
A.在唯一索引上使用范围操作符(>、<、>=、<=、<>、BETWEEN)
B.在组合索引上使用部分列进行查询,导致查出多行


索引唯一扫描 (index unique scan)、

区别索引范围扫描的是索引唯一扫描要么返回0行数据要么返回1行数据,不会返回多行数据。Oracle使用索引唯一扫描时,一旦发现时数据,则停止继续扫描,因此效率很高。如果唯一索引是组合索引,则至少需要参与索引的列作为引导列。
索引跳跃式扫描 (index skip scan)、

复当表有一个复合索引,而在查询中有除了索引中第一列的其他列作为条件,并且优化器模式为CBO,这时候查询计划就有可能使用到索引跳跃式扫描 。此外,还可以通过使用提示index_ss(CBO下)来强制使用索引跳跃式扫描。
位图索引扫描(bitmap index scan),

 

何时需要索引
一般地,对于从表的总行中的大部分查询只查询不到10%数据(有的称为2%-4%)的表,可以考虑创建索引。一般考虑的索引的原则包括:
 
对于经常以查询关键字为基础的表,并且该表中的数据行是均匀分布的
以查询关键字为基础,表中的数据行随机排序
表中包含的列数相对比较少(仅仅是相对,需要根据实际情况确定)
表中的大多数查询都包含相对简单的WHERE子句
表的记录数比较少的,不建议使用索引,如数据不超过1万行的表不要建立索

 

 

原创粉丝点击