第四章 访问路径 access path

数据库SQL优化为什么涉及访问路径呢?
访问路径指的就是通过哪种扫描的方式获取数据,比如全表扫描、索引扫描、或者直接通过ROWID获取数据,要想成为SQL优化的高手就必须理解各种访问路径。
1、全表扫描 table access full
全表扫描就是扫描表中所有格式化过的区域,因为区里面的数据块在物理上是连续的,所以全表扫描可以多块读。全表扫描不能跨区读,因为区与区之间的块在物理上不一定是连续的。(PS:oracle数据库中最小的存储单位是块block)
当表中存在clob字段时,Oracle进行全表扫描时,性能会急速下降,因此,建议将clob字段拆解为多个varchar2字段

2、table access by user rowid 表示直接通过rowid获取数据,单块读
这是Oracle访问路径中,性能最好的一种方式
table access by rowid range  表示rowid范围扫描,多块读
table access by index rowid   表示回表,单块读
3、index unique scan 表示索引唯一扫描,单块读
index range scan  表示索引范围扫描,单块读
index skip scan 索引跳跃扫描,单块读,where 过滤条件中对组合索引中非引导列进行过滤的时候就会发生索引跳跃扫描
index full scan 索引全表扫描 单块读 
index fast full scan 索引快速全表扫描 多块读 

以上写了很多总SQL访问路径的方式,当然随着Oracle数据库的升级,可能还有其他方式。以上的每种方式,都写了单块还是多块
这里解释下,单块读与多块读的概念
单块读:单块读的物理IO次数
多块读:多块读的物理IO次数
从磁盘1次读取1个块到 buffer cache就叫单块读,一次读取多个叫多块读。如果数据已经缓存在buffer cache中就不需要物理IO了,也就没有单块和多块读之说。
绝大多数的平台,一次IO只能读取或者写入1MB数据,oracle默认块大小是8K 那么一次IO最多能写入128个块到磁盘。在判断哪个访问路径性能最好的时候,通常是估算每个访问路径的IO次数,谁的IO次数少,谁的性能就好。平时的分析中,大家也就算了大概作为参考就行了。

为什么有时候索引扫描比全表扫描更慢?
直接上理论测算过的结论;走索引返回的数据越多,需要消耗的IO次数也就越多,因此大量数据应该走全表扫描或者index fast full scan,返回少量数据才走索引扫描。
根据理论,我们一般建议返回表总行数5%以内的数据,走索引扫描,超过5%走全表扫描。