oracle的date类型字段不能使用索引问题一则

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

此条目发表在mysql/oracle/postgresql分类目录,贴了标签。将固定链接加入收藏夹。

发表评论

您的电子邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据