Oracle在执行SQL之前,首先需要为其确定执行计划。从大的角度看,执行计划包含数据扫描路径的确定和数据集合处理方式的确定两大方面的内容。
数据扫描路径特指SQL语句如何从数据库中找到所查询的数据,也就是定位数据的方法。Oracle优化器将选择数据扫描的最佳路径作为执行计划中的数据扫描计划。
从物理操作上看,Oracle会采用以下两种方式来进行读取:
单块读取数据:读取单位为Oracle数据库块。即便我们仅需要一行数据,Oracle也会将数据行所在数据块的数据完整地读入数据缓存。
连续读取数据:读取单位有Oracle参数db_file_multiblock_read_count决定(也取决于操作系统一次IO的最大值),该参数的默认设置为16.
那么如何获得需要读取那些数据块呢?
这就需要从Oracle执行数据扫描的路径来看。从逻辑角度讲,数据扫描会有两种可能——基于表的全表路径扫描和基于索引的索引路径扫描。
1、全表扫描(FTS,Full Table Scans)
2、索引路径扫描
索引不仅包含被索引的字段值,还包含行的位置标识Rowid,如果语句只检索索引字段,Oracle将直接从索引中读取而不需要通过Rowid去访问表,如果语句通过索引检索其他字段值,则Oracle通过索引获得Rowid从而迅速找到具体的行。
索引扫描类型:
1) 唯一索引扫描(Index Unique Scans)
2) 索引范围扫描(Index Range Sca