ORACLE的优化器有两种优化方式:
基于规则的优化方式(Rule-Based Optimization,简称为RBO)
RBO遵循简单的分级方法学,使用 15 种级别要点,当接收到查询,优化器将评估使用到的要点数目,然后选择最佳级别(最少的数量)的执行路径来运行查询。
基于代价的优化方式(Cost-Based Optimization,简称为CBO)
CBO尝试找到最低成本的访问数据的方法,为了最大的吞吐量或最快的初始响应时间,计算使用不同的执行计划的成本,并选择成本最低的一个,关于表的数据内容的统计被用于确定执行计划。
IF 初始化参数 OPTIMIZER_MODE = CHOOSE THEN --(8I DEFAULT)
IF 做过表分析
THEN 优化器 Optimizer=CBO(COST); /*高效*/
ELSE
优化器 Optimizer=RBO(RULE); /*高效*/
END IF;
END IF;
区别;
RBO根据规则选择最佳执行路径来运行查询。
CBO根据表统计找到最低成本的访问数据的方法确定执行计划。
使用CBO需要注意:
I) 需要经常对表进行ANALYZE 命令进行分析统计;
II) 需要稳定执行计划;
III)需要使用提示(Hint);
使用RULE 需要注意:
I) 选择最有效率的表名顺序
II)优化SQL 的写法;
在optimizer_mode=choose时,如果表有统计信息(分区表外),优化器将选择CBO,否则选RBO。