分类: Oracle
2012-11-09 10:15:19
dba培训为什么要用CBO呢?下面介绍RBO的15级访问路径。
1级:用Rowid定位单行
当WHERE子句中直接嵌入Rowid时,RBO走此路径。Oracle不推荐直接引用Rowid,Rowid可能会由于版本的改变而变化,行迁移、行链接、EXP/IMP也会使Rowid发生变化。
2级:用Cluster Join定位单行
两个表做等值连接,一方的连接字段是Cluster Key,且WHERE中存在可以保证该语句仅返回一行记录的条件时,RBO走此路径。
3级:用带用唯一约束或做主键的Hash Cluster Key定位单行
4级:用唯一约束的字段或做主键的字段来定位单行
5级:Cluster Join
6级:使用Hash Cluster Key
7级:使用索引Cluster Key
8级:使用复合索引
9级:使用单字段索引
10级:用索引进行有界限范围的查找
如,column >[=] expr AND column <[=] expr或column BETWEEN expr AND expr
或column LIKE ‘c%’
11级:用索引字段进行无界限的查找
如,WHERE column >[=] expr 或 WHERE column <[=] expr
12级:排序合并连接
13级:对索引字段使用MAX或MIN函数
14级:ORDER BY索引字段
15级:全表扫描
如果可以使用索引RBO会尽可能的去用索引而不是全表扫描,但是在下列一些情况RBO只能使用全表扫描:
如果column1和column2是同一个表的字段,含有条件column1 < column2或column1 > column2或column1 <= column2或column1 >= column2,RBO会用全表扫描。
如果使用column IS NULL或column IS NOT NULL或column NOT IN或column != expr或column LIKE ‘%ABC’时,不论column有无索引,RBO都使用全表扫描。
如果expr = expr2,expr表达式作用了一个字段上,无论该字段有无索引,RBO都会全表扫描。
NOT EXISTS子查询以及在视图中使用ROWNUM也会造成RBO进行全表扫描。
以上就是RBO的全部可用访问路径。RBO优化器死板的根据规则来选择执行计划显然不够灵活,在RBO中也无法使用物化视图等Oracle提供的新特性,在Oracle8i时CBO已经基本成熟,因此Oracle强烈建议改用CBO优化器。