在某个表中建了个索引,但explain plan中显是用的是全表扫描,哪个高手可以回答?SQL如下:
select * from "commission_trans" 
 where "ymonth" = '200905'SELECT STATEMENT, GOAL = CHOOSE 10115 690698 SELECT STATEMENT 10115 40751182
 TABLE ACCESS FULL UXPOS commission_trans 10115 690698 TABLE ACCESS 1 40751182注:ymonth是有建索引的,而输出结果记录数只占全表的2%左右。

解决方案 »

  1.   

    你ymonth是什么数据类型,在这个列你不能运用函数或其它任何隐匿转换
      

  2.   

    ymonth是varchar2类型,没用隐性转换。
      

  3.   

    转载不走索引大体有以下几个原因
    你在Instance级别所用的是all_rows的方式
    你的表的统计信息(最可能的原因)
    你的表很小,Oracle的优化器认为不值得走索引。
    解决方法
    可以修改init.ora中的OPTIMIZER_MODE这个参数,把它改为Rule或Choose,重起数据库。也可以使用Hint.补充:不走索引的原因,甚至加上 /*+index(table_name index_name)*/还不走索引,那可能是因为你要走索引的这列是nullable,虽然这列没有空值。
      

  4.   

    表很大,接近3000W记录。
    alter session set optimizer_mode=choose;也执行过,一样的。
    nullable=Y 就会导致不走索引吗?没听说过,如果是真的话,我其它的表也有这样的索引,也可以走啊,我想不会是这个原因吧?
      

  5.   


    1,你的sql如此精炼,能不能把你的后面的条件写成绑定变量的形式,这样的话也可以提高一些效率!2,看来要从数据库底层来考虑下你的sql执行的效率了。有没有可能是索引失效了,重建索引试试看。
      

  6.   


    什么叫使用hint?请指教,谢谢!
      

  7.   

    7 楼 oraclelogan 大侠:
    请问什么是绑定变量形式?
      

  8.   

    参考:Oracle HINT的常见用法用HINT方式可以强制一个SQL语句使用index,如果你强制使用的index还是全表扫描的话,那就说明这个索引坏掉了,需要重建。
      

  9.   

    hints是优化必备的玩意儿.
    我指的是如果你的数据库很少执行analyze的话.