我们现在已经知道,在对语句进行解析时,由优化器(Optimizer)生成和选择语句的执行计划。而优化器生成和选择执行计划的过程也就是对 SQL 的执行方式进行优化(Optimizing)的过程。
整个过程可分为三个步骤:查询转换、代价估算已及计划生成,分别由组件查询转换器(Query Transformer)、代价估算器(Estimator)和计划生成器(Plan Generator)完成。在 Oracle 中,有两种优化器:基于规则的优化器(Rule Based Optimizer,RBO)和基于代价的优化器(Cost Based Optimizer,CBO)。
• 基于规则的优化器(RBO)
尽管 RBO 还存在于 Oracle 的优化器当中,并且在某些特定环境中仍然起作用,但从 10g 开始,
Oracle 已经不再对其做技术支持,而是推荐用户尽量使用 CBO。我们这里仅对 RBO 做简要介绍,而以后再提到优化器,除非特别指示为 RBO,否则都是指 CBO。
RBO 在选择执行计划时,按照系统的特定规则取优先级最高的访问路径。这些规则仅考虑对象结构,不考虑对象上面的数据。以下是 RBO 中访问路径的排序,优先级由高到低:
1、 通过 ROWID 访问单条数据记录(Single Row by Rowid)
2、 通过簇关联访问单条数据记录(Single Row by Cluster Join)
3、 通过唯一键或者主键的哈希簇访问单条数据记录(Single Row by Hash Cluster Key with Unique or Primary Key)
4、 通过唯一键或者主键访问单条数据记录(Single Row by Unique or Primary Key)
5、 簇关联(Clustered Join)
6、 访问哈希簇键值(Hash Cluster Key)
7、 访问索引簇键值(Indexed Cluster Key)
8、 访问复合索引(Composite Index)
9、 访问单字段索引(Single-Column Indexes)
10、 闭包范围查询索引字段(Bounded Range Search on Indexed Columns),即范围查询条件包括起始和结束值,如 BETWEEN AND、LIKE;
11、 非闭包范围查询索引字段(Unbounded Range Search on Indexed Columns),即范围查询条件仅包括起始或结束值,如>[=]、<[=];
12、 排序合并关联(Sort Merge Join)
13、 索引字段上取最大、最小值(MAX or MIN of Indexed Column)
14、 对索引字段排序(ORDER BY on Indexed Column)
15、 全表扫描(Full Table Scan)
• 基于代价的优化器(CBO)
CBO 在选择执行计划时,会枚举各种可能的访问路径、关联方法、关联顺序及其它可能的操作。由对象及系统的相关统计数据,按照特定公式计算各种操作的代价,并最终选择一个总代价最小的 计划作为执行计划。




