Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1168259
  • 博文数量: 178
  • 博客积分: 2776
  • 博客等级: 少校
  • 技术积分: 2809
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-22 15:36
文章分类

全部博文(178)

文章存档

2014年(3)

2013年(66)

2012年(109)

分类: Oracle

2012-11-09 10:15:19

  dba培训为什么要用CBO呢?下面介绍RBO15级访问路径。

  

  1级:用Rowid定位单行

  当WHERE子句中直接嵌入Rowid时,RBO走此路径。Oracle不推荐直接引用RowidRowid可能会由于版本的改变而变化,行迁移、行链接、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 <[=] exprcolumn BETWEEN expr AND expr

  或column LIKE c%

  11级:用索引字段进行无界限的查找

  如,WHERE column >[=] expr WHERE column <[=] expr

  12级:排序合并连接

  13级:对索引字段使用MAXMIN函数

  14级:ORDER BY索引字段

  15级:全表扫描

  如果可以使用索引RBO会尽可能的去用索引而不是全表扫描,但是在下列一些情况RBO只能使用全表扫描:

  如果column1column2是同一个表的字段,含有条件column1 < column2column1 > column2column1 <= column2column1 >= column2RBO会用全表扫描。

  如果使用column IS NULLcolumn IS NOT NULLcolumn NOT INcolumn != exprcolumn LIKE %ABC时,不论column有无索引,RBO都使用全表扫描。

  如果expr = expr2expr表达式作用了一个字段上,无论该字段有无索引,RBO都会全表扫描。

  NOT EXISTS子查询以及在视图中使用ROWNUM也会造成RBO进行全表扫描。

  以上就是RBO的全部可用访问路径。RBO优化器死板的根据规则来选择执行计划显然不够灵活,在RBO中也无法使用物化视图等Oracle提供的新特性,在Oracle8iCBO已经基本成熟,因此Oracle强烈建议改用CBO优化器。

 

阅读(825) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~