1.1 oracle里的优化器

RBO(Rule-Based-Optinizer):基于规则的优化器

CBO(Cost-Based-Optinizer): 基于成本的优化器

SQL语句执行过程

待执行的sql → 解析 (语法,语义,权限检查)→ 查询转换 → 优化器(RBO/CBO)→ 执行计划 → 实际执行 → 结果

1.1.1 基于规则的优化器 RBO

oracle会在代码中事先给各种执行路径定一个等级,共有15个等级,其中等级1 执行率最高,RBO会从中选择等级值低的来执行

OLTP:可理解为平常的增删查改,rowid的访问方式效率最高

OLAP:数据仓库的核心 如 hive

RBO 从oracle 10g开始不被支持,但相关实现仍存在,可以继续使用

Oracle 索引组织表(IOT):http://blog.csdn.net/dnnyyq/article/details/5195472

下列情况不会使用RBO:

  • 目标SQL设计IOT
  • 对象有分区表
  • 使用了并行查询或者并行DML
  • 使用了星型链接
  • 使用了哈希连接
  • 索引快速全扫描
  • 使用了函数索引

很难对RBO选择进行调整 其中 RULE Hint 和 DRIVING_SITE Hint 例外,他们可以在RBO下使用,并且不自动启用CBO

手动调整RBO

1.等价改写目标SQL where条件中NUMBER 和 DATE 类型加0 varchar2和char || ‘’  加上空字符

2.调整相关对象在数据字典缓存顺序 适用于有等级值相同的情况

create index idx_mgr_temp on emp_temp(mgr);
create index idx_deptno_temp on emp_temp(deptno);

oracle里的优化器-LMLPHP

alter session set optimizer_mode='RULE';
SET AUTOTRACE TRACEONLY EXPLAIN;

select * from emp_temp where mgr >100 and deptno >100;

oracle里的优化器-LMLPHP

select * from emp_temp where mgr >100 and deptno +0>100;

oracle里的优化器-LMLPHP

可以删除索引再创建索引来修改在数据字典中的缓存顺序,验证执行计划修改

RBO会按照从右往左的顺序决定谁是驱动表

05-08 15:38