发表于: DB/ES | 作者: | 日期: 2009/8/20 02:08
标签:

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

: https://blog.darkmi.com/2009/08/20/939.html

本文相关评论 - 1条评论都没有呢
Post a comment now » 本文目前不可评论

No comments yet.

Sorry, the comment form is closed at this time.