CBO&RBO

来源:互联网 发布:网络中介怎么做的 编辑:程序博客网 时间:2024/05/16 10:03
Oracle的优化器有两种,基于规则的优化器(RBO)和基于代价的优化器(CBO)。 在8i之前,Oracle使用的是RBO(Rule Based Optimizer,基于规则的优化器),他的执行非常简单,就是在优化器里面嵌入15种规则,执行SQL语句符合哪种规则,就按照规则定制出相应的SQL执行计划。由于他是一种过时呆板的优化器,在10g以后的版本中已经被踢出掉了。 从8i开始,Oracle引入了CBO(Cost Based Optimizer,基于代价的优化器),他的思路是让Oracle获取所有的执行计划的相关信息,通过这些信息做计算分析,最后得出一个代价最小的执行计划作为最终的执行计划。 CBO优化器有两种可选的运行模式: FIRST_ROWS(n) ALL_ROWS 当设置优化器模式为:FIRST_ROWS(n)时,意味
着Oracle在执行SQL语句时,优先考虑将结果集中的前n条记录以最快的速度反馈回来,而其他结果并不需要同事反馈,也就是说在处理数据的时候,后面的数据可能还没提取出来,前面的数据已经返回给用户了,这种需求在网站搜索或者BBS的分页上经常看到。比如每次只显示查询信息的前20条,这时设置FIRST_ROWS(20)就非常合适。对于分页操作,越靠前的页,显示结果需要的时间将越短。 下面举一个典型的分页的例子:
 idle> select /*+first_rows(10)*/ b.x,b.y   
2 from (select /*+first_rows(10)*/ a.*,rownum   
3 from (select /*+first_rows(10)*/ from t order by x) a   
4 where rownum<S=20) b   
5 where rownum>=10; 
需要注意的是排序使用的X必须创建有索引,否则CBO会忽略FIRST_ROWS(n)而使用ALL_ROWS. CBO的模式为ALL_ROWS时,意味着我们需要Oracle以最快的速度将SQL执行完毕,将结果集全部返回。它和FIRST_ROWS(n)的区别在于,ALL_ROWS强调整体的执行效率,而FIRST_ROWS(n)强调以最快的速度返回前n条记录。ALL_ROWS在OLAP系统中使用的比较多,它的目的在于快速获取执行结果的最后一条记录。 
可以通过下面语句修改optimizer_mode alter system set optimizer_mode=all_rows scope=both;
区别:
   RBO根据规则选择最佳执行路径来运行查询。
   CBO根据表统计找到最低成本的访问数据的方法确定执行计划。

   使用CBO需要注意:
   I) 需要经常对表进行ANALYZE命令进行分析统计;
   II) 需要稳定执行计划;
   III)需要使用提示(Hint);
   使用RULE需要注意:
   I) 选择最有效率的表名顺序
   II) 优化SQL的写法;
在optimizer_mode=choose时,如果表有统计信息(分区表外),优化器将选择CBO,否则选RBO。
RBO遵循简单的分级方法学,使用15种级别要点,当接收到查询,优化器将评估使用到的要点数目,然后选择最佳级别(最少的数量)的执行路径来运行查询。
CBO尝试找到最低成本的访问数据的方法,为了最大的吞吐量或最快的初始响应时间,计算使用不同的执行计划的成本,并选择成本最低的一个,关于表的数据内容的统计被用于确定执行计划。
0 0