jdbc查询时,传⼊Date类型导致索引失效
发现明明有索引,当但是查询还是很慢。花费了⼏个⼩时。终于到原因了。
之前试过使⽤强制索引。但是⽆效。
select /*+index(fy IDX_JFRQ)*/ *from tab fy where jfrq>?
⽹上到原因:
由于需要⼩时分秒的信息,我们使⽤的是java.util.Date,观察发现在数据库端有类似如下函数转换
1. TO_TIMESTAMP(date_column) = parameter_timestamp
导致纵然加了hit也⾛不上索引.
为什么会触发oracle做隐式转换呢?因为在ibatis的处理中,java.util.Date会转换为java.sql.Timestamp(具体原因可以参考
java.sql.PreparedStatement和相关⽂档,在此不详述)
1. ps.setTimestamp(i, new java.sql.Timestamp(((Date) parameter).getTime()))
JAVA传下去的是Timestamp,⽽数据库的类型是Date,根据oracle的策略,会对date类型做强制转换TO_TIMESTAMP(GMT_SEND),因此就⾛不上索引了 。
解决⽅案:
经过⽹上查询,认为可选且⽐较靠谱的解决⽅案主要有三种:
a.将数据库的列改为timestamp(修改了业务逻辑,该字段只要⽇期,不需要时间)
b.使⽤to_date('2020-03-08','yyyy-mm-dd')
to_date(to_char(?,'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS');oracle 时间转换
c.将传⼊参数由java.util.Date转换为String,然后在ibatis端使⽤to_date函数解决(改动点太多)
and fjrq >= to_date(?,'YYYY-MM-DD HH24:MI:SS')
d.给GMT_SEND字段建函数索引(为了⾛索引⽽⾛索引,不是正常的解决问题的办法)
e.cast函数转成Date类型,最终是采⽤这种⽅案,对现有程序功能⽆影响且直接解决问题
and jfrq >= cast(? as date)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。