一个日期的全表扫描
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*/)
比较一下