select  *
 from fzdc.cwtz_gjh
where rq between to_date('20100301','yyyymmdd') and to_date('20100331','yyyymmdd')create index cwtz_gjh_rq on cwtz_gjh(rq)
analyze table cwtz_gjh compute statisticsSELECT STATEMENT, GOAL = CHOOSE Cost=2 Cardinality=603 Bytes=27135
 TABLE ACCESS FULL Object owner=FZDC Object name=CWTZ_GJH Cost=2 Cardinality=603 Bytes=27135
我明明已经建了rq索引为什么还全表扫描呢?

解决方案 »

  1.   

    1 没有表的统计信息。2 ORACLE评估后认为,走索引还不如走全表扫描快。不是有索引就一定要用的,比如返回结果集占表比例非常大。比如你的表非常小,=====
      

  2.   

    1, 你的rq确认是date类型吗?
    2, 表中的数据是从哪天开始的,如果总共只有2个月的数据,你使用一个between and的返回超过50%的结果肯定不会走索引(疑似超过5%oracle就拒绝使用索引了);
    3,如果你非要走索引可以尝试加hint
      select /*+index(a cwtz_gjh_rq)*/ *
     from fzdc.cwtz_gjh a
    where rq between to_date('20100301','yyyymmdd') and to_date('20100331','yyyymmdd')
      

  3.   

    扫描索引也是需要成本的,如果扫描索引成本
    加上根据索引查找到的ROWID读数据块的成本
    大于
    扫描数据表的成本,那么ORACLE可能决定不使用索引。你也可以试试基于规则的HINT(/*+rule*/)
    比较一下