oracle里的优化器

本文详细介绍了Oracle数据库中基于规则的优化器(RBO)的工作原理及其应用。包括RBO的等级选择机制、针对不同场景的应用限制及手动调整技巧。

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.youkuaiyun.com/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会按照从右往左的顺序决定谁是驱动表

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/cc145/p/8197357.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值