`

oracle Optimizer CBO RBO (优化器)

 
阅读更多

 

Oracle 的优化器有两种:


RBO(Rule-BasedOptimization): 基于规则的优化器

CBO(Cost-BasedOptimization): 基于代价的优化器


CBO在ORACLE7 引入,但在ORACLE8i 中才成熟。ORACLE 已经明确声明在ORACLE9i之后的版本中(ORACLE 10G ),RBO将不再支持。因此选择CBO 是必然的趋势。但是我们依然可以通过Hint 方式来使用它。


Oracle 数据库中优化器(Optimizer)是SQL分析和执行的优化工具,它负责指定SQL的执行计划,也就是它负责保证SQL执行的效率最高,比如优化器决定Oracle以什么样的方式来访问数据,是全表扫描(Full Table Scan),索引范围扫描(Index Range Scan)还是全索引快速扫描(INDEX Fast Full Scan:INDEX_FFS);对于表关联查询,它负责确定表之间以一种什么方式来关联,比如HASH_JOHN还是NESTED LOOPS 或者MERGE JOIN。 这些因素直接决定SQL的执行效率,所以优化器是SQL 执行的核心,它做出的执行计划好坏,直接决定着SQL的执行效率。


一.RBO 基于规则的优化器

在8i之前,Oracle 使用的是一种叫作RBO(Rule Based Optimizer)的优化器,它的执行机制非常简单,就是在优化器里面嵌入若干种规则,执行的SQL语句符合哪种规则(RANK),则按照规则(RANK)制定出相应的执行计划,比如说表上有个索引,如果谓词上有索引的列存在,则Oracle 会选择索引,否则选择全表扫描;又比如,两个表关联的时候,按照表在SQL中的位置来决定哪个是驱动表,哪个是被驱动表。


由于RBO 只是简单的去匹配Rank,所以它的执行计划有时并不是最佳的。 比如我们有一张数据分布非常不均匀的表。 90%的数据内容是一样的,并且在这个字段上有索引。 如果我们的SQL 谓词里有这个字段,那么RBO 就会选择走索引。 这就会增加额外的开销。 因为Oracle 要先访问索引数据块,在索引上找到相应的键值,然后按照键值上的rowid 在去访问表中的相应数据。 在这种情况下,我们选择全表扫描是最优的,但是RBO 不会这么选择。


二.CBO 基于成本的优化器


从8i开始,Oracle 引入了CBO(Cost Based Optimizer),它的思路是让Oracle 获取所有执行计划相关的信息,通过对这些信息做计算分析,最后得出一个代价最小的执行计划作为最终的执行计划。


CBO是一种比RBO 更理性化的优化器。从10g开始,Oracle 已经彻底丢弃了RBO。 即使在表,索引没有被分析的时候,Oracle依然会使用CBO。此时,Oracle 会使用一种叫做动态采样的技术,在分析SQL的时候,动态的收集表,索引上的一些数据块,使用这些数据块的信息及字典表中关于这些对象的信息来计算出执行计划的代价,从而挑出最优的执行计划。


当表没有做分析的时候,Oracle 会使用动态采样来收集统计信息,这个动作只有在SQL执行的第一次,即硬分析阶段使用,后续的软分析将不在使用动态采样,直接使用第一次SQL 硬分析时生成的执行计划。


在Oracle 10g中,CBO 可选的运行模式有2种:

(1)       FIRST_ROWS(n)

(2)       ALL_ROWS  -- 10g中的默认值


查看CBO 模式:


SQL> show parameter optimizer_mode 

NAME                                 TYPE        VALUE

-----------------------------------------  -------------

optimizer_mode               string      ALL_ROWS


修改CBO 模式的三种方法:


(1)SQL 语句:

  Sessions级别:

  SQL> alter session setoptimizer_mode=all_rows;


(2) 修改pfile 参数:

OPTIMIZER_MODE=RULE/CHOOSE/FIRST_ROWS/ALL_ROWS


(3) 语句级别用Hint(/* +  ...  */)来设定

  Select /*+ first_rows(10) */ name from table;

  Select/*+ all_rows */ name from table;  


OPTIMIZER_INDEX_COST_ADJ参数

参数OPTIMIZER_INDEX_COST_ADJ可以理解为Oracle执行多块(MultiBlock)I/O(比如全表扫描)的代价与执行单块(Single-block)I/O代价的相对比例。OPTIMIZER_INDEX_COST_ADJ通过指明索引I/O代价与扫描全表I/O代价的相对比值来影响CBO的行为,取值越小,CBO越倾向于使用索引,取值越大,越倾向于全表扫描。而缺省值100,指明缺省下,二者的代价是相等。


FIRST_ROWS(n) 模式说明

当CBO 的优化模式设置为FIRST_ROWS(n)时,Oracle 在执行SQL时,优先考虑将结果集中的前n条记录以最快的速度反馈回来,而其他的结果并不需要同时返回。


这种需求在一些网站或者BBS的分页上经常看到,比如每次只显示查询信息的前20条或者BBS上的前20个帖子, 这时候设置FIRST_ROWS(20)就非常合适,优化器并不需要同事将所有符合条件的结果返回,用户也不需要。这时,CBO将考虑用一种最快的返回前20条记录的执行计划,这种执行计划对于SQL的整体执行时间也不不是最快的,但是在返回前20条记录的处理上,确实最快的。


ALL_ROWS 模式说明

当CBO 模式设置为ALL_ROWS时,Oracle 会用最快的速度将SQL执行完毕,将结果集全部返回,它和FIRST_ROWS(n)的区别在于,ALL_ROWS强调以最快的速度将SQL执行完毕,并将所有的结果集反馈回来,而FIRST_ROWS(n)则侧重于返回前n条记录的执行时间。


ALL_ROWS在OLAP 系统中使用得比较多,它用最快的速度获得SQL执行的最后一条记录,而不是前N条记录。 和FIRST_ROWS(n)正好相反。 ALL_ROWS 强调SQL整体的执行效率,而FIRST_ROWS(n)强调用最快的速度返回前N行,而不管所有的结果返回的时长,可能最后一条要很长时间才能获得。


具体什么时候使用RBO,什么时候强制使用RBO,可以查看:

 http://blog.csdn.net/suncrafted/article/details/4239237

 http://blog.csdn.net/suncrafted/article/details/4239148

分享到:
评论

相关推荐

    oracle性能优化技巧

    为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性。 如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的...

    cbo数据库优化

    cbo数据库优化,数据性能,oracle性能分析优化

    智能算法:Energy valley optimizer能量谷优化器Matlab

    智能算法:Energy valley optimizer能量谷优化器Matlab

    智能优化算法:Aquila Optimizer:金雕优化器.zip

    分享了Aquila Optimizer:金雕优化器源代码及原文,更多算法可进入空间查看

    Oracle的优化器(Optimizer)

    Oracle在执行一个SQL之前,首先要分析一下语句的执行...分析语句的执行计划的工作是由优化器(Optimizer)来完成的。不同的情况,一条SQL可能有多种执行计划,但在某一时点,一定只有一种执行计划是最优的,花费时间是最少的。

    Oracle optimizer性能优化手册 chm

    数据库开发,Oracle教程 Oracle optimizer性能优化手册 chm,主要是一些Oracle数据库在性能优化方面的技术文章,编译成CHM格式,方便大家阅读。

    如何选择Oracle优化器使你事半功倍

    为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性。 如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器...

    Oracle9i数据库系统优化与调整.pdf

    第14章 优化器(Optimizer)简介 第15章 使用优化器提示 第四部分 ORACLE系统调整 第16章 调整信息的来源 第17章 STATSPACK工具 第18章 动态性能视图与性能诊断 第19章 调整内存分配 第20章 调整物理I/O 第21...

    Understanding Optimizer Statistics (oracle 性能优化白皮书英文版)

    ORACLE 统计信息(Statistics)的查询,收集,还原,锁定,导入,导出

    Cheetah Optimizer 猎豹优化器 Matlab

    Cheetah Optimizer 猎豹优化器 Matlab

    oracle 数据库优化技术资料

    为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性. 如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器...

    oracle_sql性能优化

    为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性. 如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器...

    oracle语句优化53个规则详解

    设置缺省的优化器,可以通过对init.ora 文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST, CHOOSE,ALL_ROWS,FIRST_ROWS. 你当然也在SQL句级或是会话(session)级对其进行覆盖。 为了使用基于成本的优化器(CBO...

    barra优化器用户手册

    barra优化器用户手册,这个权威的官方文档,各位搞资产组合优化的伙伴可以参考该文档做组合优化,风险控制。

    ORACLE性能优化31条.docx

    为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性。 如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的...

    optimizer:SQL查询优化器

    用于CS3223数据库实现的查询优化器 设置 运行source queryenv 运行source build.sh 。 请注意,每次您都需要运行build.sh来重新编译代码,而不是通过诸如IntelliJ之类的任何IDE来生成项目。 建立表格 从这里开始,...

    Golden Eagle Optimizer Toolbox金鹰优化器工具箱及原文

    分享了金鹰优化器工具箱及其原文,亲测有效,更多算法可进入空间查看

    Dandelion Optimizer 蒲公英优化器 Matlab

    Dandelion Optimizer 蒲公英优化器 Matlab

    基于Oracle的SQL优化 Part1

    《基于Oracle的SQL优化》从Oracle处理SQL的本质和原理入手,由浅入深、系统地介绍了Oracle数据库里的优化器、执行计划、Cursor和绑定变量、查询转换、统计信息、Hint和并行等这些与SQL优化息息相关的本质性内容,并...

    【19】Cheetah Optimizer-猎豹优化算法附matlab代码.zip

    2.领域:智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,更多内容可点击博主头像 3.内容:标题所示,对于介绍可点击主页搜索博客 4.适合人群:本科,硕士...

Global site tag (gtag.js) - Google Analytics