首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

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

2012-03-12 
一个日期的全表扫描SQL codeselect* from fzdc.cwtz_gjhwhere rq between to_date(20100301,yyyymmdd)

一个日期的全表扫描

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*/)
比较一下

热点排行