将测试进行到底!

Oracle的优化器有两种优化方式

上一篇 / 下一篇  2010-12-15 10:05:54 / 个人分类:ORACLE

基于规则的优化方式(Rule-Based Optimization,简称为RBO)

基于代价的优化方式(Cost-Based Optimization,简称为CBO)

所以hint也不例外,除了/*+rule*/其他的都是CBO优化方式

RBO方式

 优化器在分析SQL语句时,遵循的是Oracle内部预定的一些规则。比如我们常见的,当一个where子句中的一列有索引时去走索引。

CBO方式

  它是看语句的代价(Cost),这里的代价主要指Cpu和内存。优化器在判断是否用这种方式时,主要参照的是表及索引的统计信息统计信息给出表的大小、有少行、每行的长度等信息。这些统计信息起初在库内是没有的,是做analyze后才出现的,很多的时侯过期统计信息会令优化器做出一个错误的执行计划,因此应及时更新这些信息

 

优化模式包括RuleChooseFirst rowsAll rows四种方式:

 

   Rule基于规则的方式。

 

   Choolse默认的情况下Oracle用的便是这种方式。指的是当一个表或或索引有统计信息,则走CBO的方式,如果表或索引没统计信息,表又不是特别的小,而且相应的列有索引时,那么就走索引,走RBO的方式。

 

   First Rows:它Choose方式是类似的,所不同的是当一个表有统计信息时,它将是以最快的方式返回查询的最先的几行,从总体上减少了响应时间。

 

   All Rows:也就是我们所说的Cost的方式,当一个表有统计信息时,它将以最快的方式返回表的所有的行,从总体上提高查询的吞吐量。没有统计信息则走RBO的方式

 

Oracle在那配置默认的优化规则

   AInstance级别我们可以通过在initSID.ora文件中设定OPTIMIZER_MODE=RULE/CHOOSE/FIRST_ROWS/ALL_ROWS如果没设定OPTIMIZER_MODE参数则默认用的是Choose方式。

   BSessions级别通过ALTER SESSION SET OPTIMIZER_MODE=RULE/CHOOSE/FIRST_ROWS/ALL_ROWS来设定。

   C、语句级别用Hint/*+ ... */)来设定

为什么表的某个字段明明有索引,但执行计划却不走索引?

   1、优化模式是all_rows的方式

   2、表作过analyze,有统计信息

   3、表很小,Oracle的优化器认为不值得走索引。

提示

  不区分大小写,多个提示用空格分开

 如:select /*+ hint1(tab1) hint2(TAB1 idx1) */ col1, col2 from tab1 where col1='xxx';

 如果表使用了别名,那么提示里也必须使用别名

如:select /*+ hint1(t1) */ col1, col2 from tab1 t1 where col1='xxx';

如果使用同一个表的多个用,号分开

如:select /*+ index(t1.A,t1.B) */ col1, col2

   from  tab1 t1

   where col1='xxx'; 


TAG:

hiltonli的个人空间 引用 删除 hiltonli   /   2010-12-16 15:37:04
 

评分:0

我来说两句

Open Toolbar