执行完用了大约
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 可以根据这个代价