第4章 访问路径(ACCESS PATH)
4.1、常见访问路径
4.1.1、TABLE ACCESS FULL
表示全表扫描,一般情况下是多块读;
HINT:FULL(表名/别名);
等待事件为 db file scattered read ,如果是并行全表扫描,等待事件为direct path read;
Oracle 11g中在对一个大表进行全表扫描的时候,会将表直接读入PGA,绕过buffer cache,事件direct path read 在开启了异步I/O( disk_asynch_io)的情况下统计是不准确的,可以alter system set “_serial_direct_read”=false"禁用direct path read;
db file sequential read 表示单块读;
4.1.2、TABLE ACCESS BY USER ROWID(性能最好)
表示直接用ROWID获取数据,单块读;
4.1.3、TABLE ACCESS BY ROWID RANGE
表示ROWID范围扫描,多块读;
4.1.4、TABLE ACCESS BY INDEX RANGE
表示回表,单块读;
4.1.5、INDEX UNIQUE SCAN
表示索引唯一扫描,单块读;
4.1.6、INDEX RANGE SCAN
表示索引范围扫描,单块读,返回的数据是有序的,默认升序;
HINT:INDEX(表名/别名 索引名)
对唯一索引或者主键进行范围查找,对非唯一索引进行等值查找,范围查找,就会发生INDEX RANGE SCAN。等待事件为 db file sequential read ;
INDEX RANGE SCAN DESCENDING表示索引降序范围扫描;
4.1.6、INDEX SKIP SCAN
表示索引跳跃扫描,单块读,返回的数据是有序的(默认升序);
HINT:INDEX_SS(表名/别名 索引名)
当组合索引的引导列(第一个列)没有在where条件中,并且组合索引的引导列/前几个的列的基数很低,where过滤条件对组合索引中非引导列进行过滤的时候就会发生索引跳跃扫描,等待事件为 db file sequential read ;
当执行计划中出现了INDEX SKIP SCAN,我们可以直接在过滤列上建立索引,使用INDEX RANGE SCAN代替INDEX SKIP SCAN;
4.1.7、INDEX FULL SCAN
表示索引全扫描,单块读,返回的数据是有序的(默认升序);
HINT:INDEX(表名/别名 索引名)
等待事件为db file sequential read 。
4.1.8、INDEX FAST FULL SCAN
表示索引快速全扫描,多块读;
HINT:INDEX_FFS(表名/别名 索引名);
等待事件为db file scattered read,如果是并行扫描,等待事件为 direct path read;
4.1.9、INDEX FULL SCAN(MIN/MAX)
表示索引最小/最大值扫描,单块读;
发生在select max(column) from table 或 select min(column) from table等SQL中;
select (select max(object_id) from t) ,(select min(object_id) from t) from dual ;
复制
4.1.10、MAT_VIEW REWRITE ACCESS FULL
表示物化视图全表扫描,多块读;
4.2、单块读与多块读
从磁盘1次读取1个块到buffer cache就叫单块读,从磁盘1次读取多个块到buffer cache就叫多块读;
一次I/O最多只能读取或者写入1MB数据;
在判断哪个访问路径性能好的时候,通常是估算每个访问路径的I/O次数,谁的I/O次数少,谁的性能就好;
4.3、为什么有时候索引扫描比全表扫描更慢
回表消耗较多的物理I/O;