对于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重新生成统计信息。

最新文章

  1. WebGL实现HTML5贪吃蛇3D游戏
  2. BZOJ 1461: 字符串的匹配
  3. 学习android学习必备的java基础知识--四大内部类
  4. LIS 最长递增子序列问题
  5. JavaScript设计模式_05_发布订阅模式
  6. RecyclerView高速通用适配Adapter
  7. geoserver发布地图服务WMTS
  8. jQuery 3.0最终版发布,十大新特性眼前一亮
  9. [C#]使用 Jenkins 为 .Net Core 实现持续集成/部署
  10. VS打开项目 提示Asp.net4.0未在web服务器上注册的解决方案
  11. Flask Web框架
  12. ElasticSearch 6.2 Mapping参数说明及text类型字段聚合查询配置
  13. 洛谷 P1217
  14. elastic客户端TransportClient的使用
  15. 如何用cacti监控windwos
  16. 无法转换json问题 Error: Model.nodeDataArray value is not an instance of Array or NodeList or HTMLCollection
  17. 如果恨一个程序员,忽悠他去做iOS开发
  18. jq 的onchange事件
  19. Android listview与adapter用法(BaseAdapter + getView)
  20. Description &&debugDescription && runtime(debug模式下调试model)

热门文章

  1. fenby C语言 P9
  2. [UWP]使用GetAlphaMask和ContainerVisual制作长阴影(Long Shadow)
  3. JavaScript数据在内存中储存方式
  4. 在虚拟机上的关于Apache(阿帕奇)(4)基于域名访问网站
  5. 数竞大佬jhc的三角函数复习题
  6. Alibaba Java Coding Guidelines,以后的Java代码规范,就靠它了
  7. 智和网管平台SugarNMS助力网络安全运维等保2.0建设
  8. 微信小程序如何解析html内容
  9. .net里面<app.config>中value值不能填写特殊符号问题
  10. python学习之【第二篇】:Python中的数字及其所具有的方法