oracle里的优化器

存储架构 2018-01-05 阅读原文

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

博客园-原创精华区

责编内容by:博客园-原创精华区阅读原文】。感谢您的支持!

您可能感兴趣的

Simple Product Creation in Oracle Commerce Cloud An online catalog organizes your products, SKUs, and collections in a manner re...
hive集成sentry的sql使用语法 Sentry权限控制通过Beeline(Hiveserver2 SQL 命令行接口)输入Grant 和 Revoke语句来配置。语法跟现在的一些主流的关系数据库...
Azure SQL Database Table Partitioning Example ALERT: Did you know 66% of DBAs say their workload is increasing! - Click he...
Update the column to insert spaces in one of the c... How do I update the sql server table with the new data f...
SQL Server DBA On-Boarding Checklist By: Svetlana Golovko | | Related Tips:More > Professional Develop...