一、配置执行计划
Tools—Preferences—Window Types—Plan Window
二、查看执行计划
- 选中代码块
- Tools—Explain plan 或者 F5
1、执行 计划的常用列字段解释
- 基数(Cardinality) : Oracle 估计的当前操作的返回结果集行数
- 字节(Bytes) :执行该步骤后返回的字节数
- 耗费(COST)、CPU耗费: Oracle 估计的该步骤的执行成本,用于说明SQL执行的代价,理论.上越小越好(该值可能与实际有出入)
- 时间(Time):Oracle估计的当前操作所需的时间
2、执行顺序
缩进最多的最先执行; (缩进 相同时,最上面的最先执行)
三、表访问的几种方式(非全部)
- TABLE ACCESS FULL (全表扫描)
Oracle会读取表中所有的行,并检查每一行是否满足SQL语句中的Where 限制条件;
使用建议:数据量太大的表不建议使用全表扫描,除非本身需要取出的数据较多,占到
表数据总量的5%~ 10%或以上
- TABLE ACCESS BY NDEX ROWID (通过ROWID的表存取)
ROWID是由Oracle自动加在表中每行最后的一列伪列,既然是伪列,就说明表中并不
会物理存储ROWID的值。
你可以像使用其它列一样使用它,只是不能对该列的值进行增、删、改操作。
一旦一行数据插入后,则其对应的ROWID在该行的生命周期内是唯-的,即使发生行
迁移,该行的ROWID值也不变。
行的ROWID指出了该行所在的数据文件、数据块以及行在该块中的位置,所以通过
ROWID可以快速定位到目标数据上,这也是Oracle中存取单行数据最快的方法:
- TABLE ACCESS BY INDEX SCAN (索引扫描)
在索引块中,既存储每个索引的键值,也存储具有该键值的行的ROWID.
1、索引扫描实际分两步:
—扫描索引得到对应的ROWID,
—通过ROWID定位到具体的行读取数据。
2、五种索引扫描
INDEX UNIQUE SCAN (索引唯一扫描):
针对唯:唯一性索引(UNIQUE INDEX)的扫描,每次至多只返回一条记录;
表中某字段存在UNIQUE、PRIMARYKEY约束时,Oracle 常实现唯一性扫描
INDEX RANGE SCAN (索引范围扫描):
使用一一个索引存取多行数据:
发生索引范围扫描的三种情况:
在唯一索引列上使用了范围操作符(如: >, <, <>, >=, <=, between) ;
在组合索引上,只使用部分列进行查询(查询时必须包含前导列,香则会走全表扫描);
对非唯一索引列上进行的任何查询;
INDEX FULL SCAN (索引全扫描):
进行全索引扫描时,查询出的数据都必须从索引中可以直接得到;
INDEX FAST FULL SCAN (索引快速扫描):
扫描索引中的所有的数据块,与NDEX FULL SCAN类似,但是一个显著的区别是它
不对查询出的数据进行排序( 即数据不是以排序顺序被返回) ;
INDEX SKIP SCAN (索引跳跃扫描):
表有一个复合索引,且在查询时有除了前导列(索引中第一列) 外的其他列作为条件:
四、Oracle优化器
- RBO (Rule-Based Optimization)基于规则的优化器
RBO有严格的使用规则,只要按照这套规则去写SQL语句,无论数据表中的内容怎样,
也不会影响到你的执行计划。换句话说,RBO对数据“不敏感”,它要求SQL编写人员必
须要了解各项细则。RBO -直沿用至ORACLE 9i,从ORACLE 10g开始,RBO已经彻底
被抛弃。
- CBO (Cost-Based Optimization)基于代价的优化器
CBO是一种比RBO更加合理、可靠的优化器,
在ORACLE 10g中完全取代RBO. CBO
通过计算各种可能的执行计划的“代价",即COST,从中选用COST最低的执行方案作为实
际运行方案。