查询慢的问题,经过验证和查询,已经初步得出结论,发现我们查询所用的时间字段传输的java.util.Date,在ibatis里通过jdbcType方式赋值
#endTime
:TIMESTAMP#,
而数据内字段的类型是DATE,在数据库内做类型转换会很耗时,Oracle支持Date和
TIMESTAMP两种时间类型,而我们数据库设计都是Date类型但是itabits里使用的都是
TIMESTAMP.
两种解决办法,测试时间都能将查询的3-5分钟提升到十几秒,用PLSQL执行也是十几秒。
方法一: 改成传输字符串,在ibatis里用to_date函数转成java.sql.date类型,
tr.TRADE_START_TIME <=
to_date(#endTime#, 'yyyymmdd hh24:mi:ss')
方法二: 在ibatis里将jdbcType设置成 : DATE
#
endTime
:TIMESTAMP# 改成
#endTime
:DATE#
Date
:在Oracle里只能精确到秒。
TimeStamp:可以
精确到微秒。
如果数据库中时间字段定义为date类型,由于timestamp类型的精度比date类型的精度高,所以oracle会对数据库里的date类型做出隐身转换,将date类型转换为timestamp类型,由于加了函数,那么创建在date类型上的索引将不会使用到;(好像是oracle9i后开始才有的问题)
java.sql.Date无法满足包含时间信息的要求,java.sql.Timestamp在Oracle被识别为timestamp类型,跟DATE类型不符,不能使用索引。所以综合来看,使用to_date函数传入字符串类型的时间串最好。