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);
alter session set optimizer_mode='RULE';
SET AUTOTRACE TRACEONLY EXPLAIN;
select * from emp_temp where mgr >100 and deptno >100;
select * from emp_temp where mgr >100 and deptno +0>100;
可以删除索引再创建索引来修改在数据字典中的缓存顺序,验证执行计划修改
RBO会按照从右往左的顺序决定谁是驱动表