日期:2014-05-17  浏览次数:20731 次

一个日期的全表扫描
SQL code

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 statistics

SELECT 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 没有表的统计信息。

2 ORACLE评估后认为,走索引还不如走全表扫描快。

不是有索引就一定要用的,比如返回结果集占表比例非常大。比如你的表非常小,=====
------解决方案--------------------
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')

------解决方案--------------------
扫描索引也是需要成本的,如果扫描索引成本
加上根据索引查找到的ROWID读数据块的成本
大于
扫描数据表的成本,那么ORACLE可能决定不使用索引。

你也可以试试基于规则的HINT(/*+rule*/)
比较一下