background image

执行完用了大约

1.50 分钟(4 次执行取平均,每次分别为 1.45 1.51 2.00 1.46)。而执行

select count(id

 

from SWD_BILLDETAIL where cn <'6';却用了 2 个小时还没有执行完,经

分析该语句使用了

cn 列上的索引,然后利用查询出的 rowid 再从表中查询数据。我为什么

不使用

select count(cn

 

from SWD_BILLDETAIL where cn <'6';呢?后面在分析执行路径

的索引扫描时时会给出说明。

下面就是基于规则的优化器使用的执行路径与各个路径对应的等级:

RBO Path 1: Single Row by Rowid(等级最高)

RBO Path 2: Single Row by Cluster Join

RBO Path 3: Single Row by Hash Cluster Key with Unique or Primary Key

RBO Path 4: Single Row by Unique or Primary Key

RBO Path 5: Clustered Join

RBO Path 6: Hash Cluster Key

RBO Path 7: Indexed Cluster Key

RBO Path 8: Composite Index

RBO Path 9: Single-Column Indexes

RBO Path 10: Bounded Range Search on Indexed Columns

RBO Path 11: Unbounded Range Search on Indexed Columns

RBO Path 12: Sort Merge Join

RBO Path 13: MAX or MIN of Indexed Column

RBO Path 14: ORDER BY on Indexed Column

RBO Path 15: Full Table Scan(等级最低)

上面的执行路径中,

RBO 认为越往下执行的代价越大,即等级越低。在 RBO 生成执行

计划时,如果它发现有等级高的执行路径可用,则肯定会使用等级高的路径,而不管任何

其它影响性能的元素,即

RBO 通过上面的路径的等级决定执行路径的代价,执行路径的等

级越高,则使用该执行路径的代价越小。如上面

2 个例子所述,如果使用 RBO,则肯定使

用索引访问表,也就是选择了比较差的执行计划,这样会给数据库性能带来很大的负面影

响。为了解决这个问题,从

ORACLE 7 开始 oracle 引入了基于代价的优化器,下面给出了介

绍。

二、基于代价的优化器

 -- Cost Based Optimization(简称 CBO)

Oracle 把一个代价引擎(Cost Engine)集成到数据库内核中,用来估计每个执行计划

需要的代价,该代价将每个执行计划所耗费的资源进行量化,从而

CBO 可以根据这个代价