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