date字段上建立了索引,但是sql语句中使用的where条件如下:
WHERE to_char(start_time,’yyyy-mm-hh hh24:mi:ss’) > ‘2009-08-01 00:00:00′ AND to_char(start_time,’yyyy-mm-hh hh24:mi:ss’) < '2009-08-31 23:59:59';
因为使用了to_char函数,造成了索引没有使用。正确的写法如下:
WHERE start_time > to_date(‘2009-08-01 00:00:00′ ,’yyyy-mm-hh hh24:mi:ss’) AND start_time < to_date('2009-08-31 23:59:59', ,'yyyy-mm-hh hh24:mi:ss');
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
以下内容引自itpub论坛:
问题:
环境:AIX 4.3.3,oracle9.2RAC,表mytab共有数据15万条左右上。
在日期型字段(mydate)上建了一个索引(create index idx1 on mytab(mydate)),
可是SQL(select mydate from mytab where to_char(mydate,’yyyymmdd’)=’20040310’)根本不使用这个索引。
后来在该字段上建了一个函数索引:to_char(mydate,’yyyymmdd’)之后,该sql可以使用这个索引了,但是一旦加上order by mydate(select mydate from mytab where to_char(mydate,’yyyymmdd’)=’20040310′ order by mydate)之后,oracle又不使用索引了。真是非常困惑。
把数据倒到Redhat AS3+oracle10上,现象也很费解。建索引:create index idx1 on mytab(to_char(mydate,’yyyymmdd’)),SQL(select mydate from mytab where to_char(mydate,’yyyymmdd’)=’20040310’)和SQL(select mydate from mytab where to_char(mydate,’yyyymmdd’)=’20040310′ order by mydate)都能使用该索引。
那位大虾能解释上述现象啊?
答复:
我觉得你用to_char转换索引字段不可取
where to_char(mydate,’yyyymmdd’)=’20040310’)
可以转换
where mydate >= to_date(‘20040310′,’yyyymmdd’)
and mydate < to_date('20040311','yyyymmdd')
原帖地址:http://www.itpub.net/thread-208701-1-1.html
Sorry, the comment form is closed at this time.
No comments yet.