对于CBO的理解:
RBO-----基于规则的优化器
CBO-----基于代价的优化器
CBO计算执行计划的代价(cost),并从中选择cost最低的执行方案,它依赖数据库对象的统计信息,统计信息的及时性和准确性都会影响CBO作出最优的决策,因为RBO死板的认定规则,对数据不敏感,规则是死的,数据是活的,而且数据具有变化性和时效性,所以RBO生成的执行计划是不准确的,不是最优的。CBO选择的执行计划是建立在统计信息的基础上,统计信息的及时性和准确性影响着CBO作出最优决策。
 
CBO优化器根据SQL语句生成一组可能被使用的执行计划,估算出每个执行计划的代价,并调用计划生成器(Plan Generator)生成执行计划,比较执行计划的代价,最终选择一个代价最小的执行计划。查询优化器有查询转换器(Query Transformer),代价估算器(Estimator)和计划生成器(Plan Generator)组成。
 
CBO优化器的组件:
1.查询转化器(Query Transformer):
    查询转换器的作用就是等价改变查询语句的形式,以便产生更好的执行计划,它决定是否重新用户的查询(包括视图合并、谓词推进、非嵌套子查询/子查询反嵌套、物化视图重写),以便生产更好的查询计划。
2.代价评估器(Estimator)
    评估器通过复杂的算法结合来统计信息的三个值来评估各个执行计划的成本:选择性(Selectivity)、基数(Cardinality)、成本(Cost)。
3.计划生成器(Plan Generator)
    计划生成器就是生成大量的执行计划,然后选择其总体代价或者总体成本最低的一个执行计划。
  流程图:
     
 
对于analyze的个人理解:
analyze执行后,生成的统计信息在user_table里面,select * from user_tables where table_name=""
收集统计信息的目的是为了让CBO的执行计划更加准确
在analyze之前,user_table内很多字段都是空值,收集统计信息后,就开始有数据了,这些数据就是通过分析表得到的,而在收集完统计信息后,执行计划就可能发生变化。
 
analyze可以指定分析:表,字段,索引。如果不指定就是默认全部都分析
①---SQL> analyze table fsd.cl_loan_acct_hist compute statistics ;
②---SQL> analyze table fsd.cl_loan_acct_hist compute statistics for table for all indexes for all columns;
                                                                                                              表                索引                  字段列
③---SQL> analyze table fsd.cl_loan_acct_hist compute statistics for table for all indexes for all indexes columns;
其中①是默认情况,等价于②
 
统计信息的生成可以有完全计算法和抽样估算法,SQL例句如下:
完全计算法:analyze table abc compute statistics;
抽样估算法(20%):analyze table abc estimate statistics sample 20 percent;
对表作完全计算所花的时间相当于做全表扫描,抽样估算法由于采用抽样,比完全计算法的生产统计速度要快。
 (下一个随笔会对统计信息做详细分析)
因为CBO是按照执行计划的代价(cost)来择优选择运行方案,所以要让CBO合理利用数据的统计信息,使用analyze或者 dbms_stats重新生成统计信息。

CBO优化器实用理解的更多相关文章

  1. Oracle中CBO优化器简介

    Oracle中CBO优化器简介 Oracle数据库中的优化器是SQL分析和执行的优化工具.它负责制定SQL的执行计划,也就是它负责保证SQL的执行计划的效率最高,比如优化器决定Oracle以什么样的方 ...

  2. ORACLE优化器RBO与CBO介绍总结

    RBO和CBO的基本概念 Oracle数据库中的优化器又叫查询优化器(Query Optimizer).它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划.Oracle的优化器有两种,基 ...

  3. [转]ORACLE优化器RBO与CBO的区别

    RBO和CBO的基本概念 Oracle数据库中的优化器又叫查询优化器(Query Optimizer).它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划.Oracle的优化器有两种,基 ...

  4. CBO 基于成本的优化器[基础]

    转载:CBO基于成本的优化器 ----------------------------------2013/10/02 CBO基于成本的优化器:让oracle获取所有执行计划的相关信息,通过对这些信息 ...

  5. Oracle的优化器介绍

    Oracle优化器介绍 本文讲述了Oracle优化器的概念.工作原理和使用方法,兼顾了Oracle8i.9i以及最新的10g三个版本.理解本文将有助于您更好的更有效的进行SQL优化工作. RBO优化器 ...

  6. PLSQL_性能优化系列04_Oracle Optimizer优化器

    2014-09-25 Created By BaoXinjian

  7. Oracle优化器介绍

    Oracle优化器介绍 本文讲述了Oracle优化器的概念.工作原理和使用方法,兼顾了Oracle8i.9i以及最新的10g三个版本.理解本文将有助于您更好的更有效的进行SQL优化工作. RBO优化器 ...

  8. Oracle 课程五之优化器和执行计划

    课程目标 完成本课程的学习后,您应该能够: •优化器的作用 •优化器的类型 •优化器的优化步骤 •扫描的基本类型 •表连接的执行计划 •其他运算方式的执行计划 •如何看执行计划顺序 •如何获取执行计划 ...

  9. optimizer_mode优化器模式

    查询优化器最主要的工作就是接受输入的SQL以及各种环境参数.配置参数,生成合适的SQL执行计划(Execution Plan). Query Optimizer一共经历了两个历史阶段: RBO: Ru ...

随机推荐

  1. MIT线性代数:2.消元法

  2. Java IO编程——文件拷贝

    在操作系统里面有一个copy命令,这个命令的主要功能是可以实现文件的拷贝处理,现在要求模拟这个命令,通过初始化参数输入拷贝的源文件路径与拷贝的目标路径实现文件的拷贝处理. 需求分析: ·需要实现文件的 ...

  3. 短期Flag

    十一我不想放假,我想成为那10个被拉出去去南方虐的人之一. 然而我现在,最近考得连能不能稳在之留下10个人的第一机房都有点悬. 最近的问题都无法解决,这个短期flag我也不想让它倒啊! 所以,Deep ...

  4. NOIP模拟 29

    T1第一眼觉得是网络流 看见4e6条边200次增广我犹豫了 O(n)都过不去的赶脚.. 可是除了网络流板子我还会什么呢 于是交了个智障的EK 还是用dijkstra跑的 居然有50分!$(RP--)$ ...

  5. 命运Ⅰ&命运Ⅱ

    upd:为啥下面的相关博文都是各种退役记(这TM怎么就相关了) 竟然被卡线了,16名,我这几次考试也是炸到了一定境界了... 前三次模拟总榜rk1,第一次分机房rk4,第二次分机房rk11,第三次分机 ...

  6. js内容溢出用省略号(...)表示

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. vue+element UI以组件递归方式实现多级导航菜单

    介绍 这是一个是基于element-UI的导航菜单组件基础上,进行了二次封装的菜单组件,该组件以组件递归的方式,实现了可根据从后端接收到的json菜单数据,动态渲染多级菜单的功能. 使用方法 由于该组 ...

  8. Mac中的Python安装selenium,结合chrom及chromdriver使用

    一.安装selenium 1.在终端通过命令安装 pip3 install -U selenium 二.准备环境 1.在电脑中安装谷歌浏览器chrom,和下载估计浏览器驱动chromdriver,以下 ...

  9. Java 博客系统 Tale

    Tale Tale的英文含义为故事,我相信每个坚持写Blog的人都是有故事的:中文你叫它 塌了 也无所谓 . Tale 使用了轻量级mvc框架 Blade 开发,默认主题使用了漂亮的 pinghsu, ...

  10. python语言线程标准库threading.local源码解读

    本段源码可以学习的地方: 1. 考虑到效率问题,可以通过上下文的机制,在属性被访问的时候临时构建: 2. 可以重写一些魔术方法,比如 __new__ 方法,在调用 object.__new__(cls ...