原因很多,说其中一个:
在对表的索引列做histgram后,如果你的条件的值占了总行数的x%,CBO
会使用full table scan,那个x是多少,忘了

解决方案 »

  1.   

    choose模式是让oracle自己选择优化器,如果你的查询的表作过统计信息的话,oralce会于使CBO(基于成本的优化器),CBO会跟据统计信息决定成本最低的执行路径,CBO有时会错误的认为全表扫描的成本低于缩引访问的成本,因而使用全表扫描。
    你可以调整optimizer_index_cost_adj参数,为索引扫描改变成本,以告知CBO倾向于使用索引扫描而不是全表扫描。
    optimizer_mode=rule则是强制oracle使用基于规则的优化,他更倾向于使用索引
      

  2.   


     CBO会跟据统计信息决定成本最低的执行路径
     --------------------------------------
      大多数情况下是这样,但是也有例外。 因为CBO还是非常的智能.  
      1. 对SQL调优最好的方式就是查询计划 + Tkprof。 
      2. 至于究竟应该全表扫描还是使用索引,是由cost决定的。
       
         如果CBO选择了错误的执行路径,你仍然可以使用Hints 来强制
         执行某一个查询策略.   3. 举个简单的例子:       两个表结构基本一样的表,一个有索引(T1), 一个没有索引(T2),
          CBO访问T1表的索引列会使用Index Range Scan,而访问T2表会使用
          Full Table Scan。   4.  当然,某些初始化参数例如db_file_multiblock_read_count会对
          cbo使用索引或者全表扫描产生影响.  5.  一定要消除这个错误概念 "索引访问一定比全表扫描效率好", 一般
          来说,如果通过索引返回的行数超过总行数的30&,这个索引就不是
          很有效率了.  6.  可以参考的文档或书籍:           <<Oracle Performance Tuning 101>>
             <<Oracle 高性能SQL指南>>
      
       
     
      

  3.   

    纠正:  CBO还不是非常的智能
      

  4.   

    是啊,CBO还在发展中,而RBO已经发展了很久了,相对来讲比较成熟了
      

  5.   

    to 楼上:
       RBO属于过时的技术了,以后的版本中Oracle将会只支持CBO.