0
点赞
收藏
分享

微信扫一扫

Oracle CBO 与 RBO


Oracle的优化器有两种优化方式: 

基于规则的优化方式:Rule-Based Optimization(RBO)

基于成本或者统计信息的优化方式(Cost-Based Optimization:CBO)

   

 

    RBO方式:优化器在分析SQL语句时,所遵循的是Oracle内部预定的一些规则。比如我们常见的,当一个where子句中的一列有索引时去走索引。

  方式:CBO是在ORACLE7 引入,但到ORACLE8i 中才成熟。ORACLE 已经声明在ORACLE9i之后的版本中,RBO将不再支持。它是看语句的代价(Cost),这里的代价主要指Cpu和内存。​​CPU​​的计算方式现在默认为CPU+I/O两者之和.可通过DBMS_XPLAN.DISPLAY_CURSOR观察更为详细的执行计划。优化器在判断是否用这种方式时,主要参照的是表及索引的统计信息。统计信息给出表的大小、有少行、每行的长度等信息。这些统计信息起初在库内是没有的,是做analyze后才出现的,很多的时侯过期统计信息会令优化器做出一个错误的执行计划,因些应及时更新这些信息。按理,CBO应该自动收集,实际却不然,有时候在CBO情况下,还必须定期对大表进行分析。这个可以用定时的Job来实现,具体参考blog:



Oracle 10g Statistic数据统计

​​http://www.cndba.cn/Dave/article/1595​​

 


注意:走索引不一定就是优的,比如一个表只有两行数据,一次IO就可以完成全表的检索,而此时走索引时则需要两次IO,这时全表扫描(full table scan)是最好。

 

 



Oracle使用Optimizer_mode参数来控制优化器的偏好,9i常用的几个参数有:first_rows,all_rows,first_rows_N,rule,choose等。而10g少了rule和choose。

  :基于规则的方式。

   :指的是当一个表或或索引有统计信息,则走CBO的方式,如果表或索引没统计信息,表又不是特别的小,而且相应的列有索引时,那么就走索引,走RBO的方式。

    First Rows:它与Choose方式是类似的,所不同的是当一个表有统计信息时,它将是以最快的方式返回查询的最先的几行,从总体上减少了响应时间。

All Rows: 10g中的默认值,也就是我们所说的Cost的方式,当一个表有统计信息时,它将以最快的方式返回表的所有的行,从总体上提高查询的吞吐量。没有统计信息则走RBO的方式。





设定优化模式:

(1)Instance级别我们可以通过在initSID.ora文件中设定

OPTIMIZER_MODE=RULE/CHOOSE/FIRST_ROWS/ALL_ROWS

SQL> show parameter optimizer_mode

NAME                                 TYPE        VALUE

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

optimizer_mode                       string      ALL_ROWS

(2) Sessions级别通过ALTER SESSION SET OPTIMIZER_MODE=RULE/CHOOSE/FIRST_ROWS/ALL_ROWS来设定。

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

常见Oracle HINT的用法

​​http://www.cndba.cn/Dave/article/1218​​

 


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,指明缺省下,二者的代价是相等。



官方文档(Reference)中对这个参数描述如下:


OPTIMIZER_INDEX_COST_ADJ

Property

Description

Parameter type

Integer

Default value

100

Modifiable

ALTER SESSION, ALTER SYSTEM

Range of values

1 to 10000



OPTIMIZER_INDEX_COST_ADJ lets you tune optimizer behavior for access path selection to be more or less index friendly—that is, to make the optimizer more or less prone to selecting an index access path over a full table scan.

The default for this parameter is 100 percent, at which the optimizer eval(满); DBA2 群:62697977

举报

相关推荐

0 条评论