Rule Based Optimizer 基于规则的SQL优化器

Submitted by Lizhe on Mon, 03/27/2017 - 17:56

 

待执行的SQL语句进入数据库系统后都会进入查询优化器进行查询转换.

在Oracle 10g之前, Oracle会默认使用RBO规则

数据库会将查询条件分成15个等级, 通过判断条件(动作)的级别高低来决定那个谓词被优先执行

例如 基于rowid的查询级别是最高的为1, 全表扫描的执行级别最低为15

基于RBO优化器的一个明显缺点在于, 依靠硬编码来确定的规则很难被动态改变, 编写SQL语句的时候需要十分注意

这里如果你跟我一样使用的是10g之后的版本,我们需要使用下面的命令将优化器暂时改成RBO ( 只对当前session有效,不用再改回来)

alter session set optimizer_mode='RULE';

然后我执行一个执行计划

 

EXPLAIN PLAN FOR select * from INO_OUTAGES.OUTAGE where SUBCATEGORY='NBN Outage';
SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));

 

1

 

explain plan for select * from INO_SCHEDULING.IS_COMMANDS;
select * from table(dbms_xplan.display);

 

2