当前位置: 代码迷 >> Oracle开发 >> 一个日期的全表扫描,该怎么解决
  详细解决方案

一个日期的全表扫描,该怎么解决

热度:156   发布时间:2016-04-24 08:02:57.0
一个日期的全表扫描
SQL code
select  * from fzdc.cwtz_gjhwhere 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 没有表的统计信息。

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*/)
比较一下
  相关解决方案