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

全部博文(178)

文章存档

2014年(3)

2013年(66)

2012年(109)

分类: 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优化器。

 

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