Oracle版本驱动中使用Java Date产生问题的解答

数据库 Oracle
Oracle版本在使用Java Date时会产生一些问题,你是否想问没有其他的方法可以来正确的提供绑定变量?本文会想你提供一些方法来解决这个问题。

如果你在Oracle版本驱动中使用Java Date时产生一些问题的时候,你是否想了解不解之处,以下的文章主要是通过对Oracle版本驱动中使用Java Date的问题的实际应用的方案的介绍,来解答你在Oracle版本驱动中使用Java Date的问题在实际操作方面的问题。

这里两天都在对一条sql进行调优。该sql并不复杂,类似于

  1. select ... from some_view union all select ... 
    from some_table where datetime 
    >= d1 and datetime< d2 and ....  

底层使用

  1. ibatis2.1.6 + oracle 10g 

今天花了些时间继续研究这个问题,导致该问题的原因的确是“导致oracle对datetime字段进行了隐式类型转换,最终CBO未能使用该列的全局索 引”,不过问题不是出在ibatis上而是Oracle driver。设我们使用这样的sql通过绑定变量(类型为java.util.date)查询数据库,其中end_date是date类型且建立了索引。

  1. “select count(*) from table1 where end_date >=
     :1 and end_date 
    <= :2” 

通常,面对这样的sql,我们希望它的执行计划走index range scan。然而在默认情况下oracle CBO是不会选择走索引地,以上面这语句为例,oracle实际走的是table full scan。为什么会这样 呢?这类问题是oracle版本在9.2以后引入了TIMESTAMP才开始出现的。

在 9.2之前,Oracle只有DATE,而没有TIMESTAMP。在jdbc preparedStatement.setTimestamp时,绑定变量的类型会被正确的设置为DATE。而在9.2之后,oracle开始支持 TIMESTAMP了,这两者都能支持精度为yyyy-MM-dd hh24:mi:ss的时间(当然TIMESTAMP能支持到纳秒级别)。

但jdbc driver的api未变同样在preparedStatement.setTimestamp时,oracle driver就得选择到底该把绑定变量的类型设置为DATE还是TIMESTAMP呢?估计是由于TIMESTAMP的精度更高,Oracle 最终默认选择了将绑定变量的类型设置为了TIMESTAMP。那么这个时候,如果面对实际属性为DATE的列,那么就会导致 oracle隐式地进行形如

  1. “TO_TIMESTAMP(date_column) = parameter_timestamp” 

转换,要 知道oracle CBO不会选择被某函数作用的列上的索引,除非是函数索引。因此,最终也会导致最上面的情况使用table full scan而不是index range scan。

Oracle版本就没有提供别的方法来正确地提供绑定变量吗?oracle提供 了几个方法来解决这个问题

1.升级到11g并使用新的正确的driver api。

2.将DATE列全都改成 TIMESTAMP列。

3.使用V8Compatible flag。

 

以上就是对Oracle版本驱动中如何使用Java Date的相关的内容的介绍,望你会有所收获。

【编辑推荐】

  1. 检查Oracle DICOM 对象的典型示例
  2. Oracle ID 自增代码的详细介绍
  3. 对Oracle Multimedia导出图像的操作步骤的描述
  4. 在Oracle模式中定义媒体对象有哪些
  5. Oracle Multimedia在ORDDicom中列中存储DICOM详解

 

责任编辑:佚名 来源: 互联网
相关推荐

2010-03-30 16:22:55

Oracle不同版本

2010-04-23 09:58:30

Oracle管理

2010-04-27 18:24:56

Oracle常见问题

2010-04-28 11:09:47

Oracle常见问题

2010-10-28 15:38:24

Oracle to_d

2012-03-08 10:18:33

JavaOracle

2010-09-25 15:20:43

SQL递归语句

2009-06-10 09:58:32

Oracle sequHibernate

2010-12-28 16:23:03

2010-03-30 14:32:38

Oracle Date

2010-10-25 16:13:31

Oracle to_d

2011-03-28 17:45:03

nagios问题

2011-04-08 16:00:11

Oracle数据库外部表

2011-07-21 11:19:51

JAVA

2009-09-23 13:04:58

HibernateOracle sequ

2010-05-11 13:42:36

MySQL隐藏空间

2015-06-30 12:39:33

公有云问题解答

2021-11-14 15:46:45

Windows 11Windows微软

2015-09-01 10:00:33

Java开发者

2009-09-08 14:53:46

CCNA考试
点赞
收藏

51CTO技术栈公众号