Oracle不同版本在驱动运行中如何使用Java Date

数据库 Oracle
本文主要涉及到的是Oracle不同版本在驱动运行中如何使用Java Date的相关实际操作步骤的介绍,希望你会有所收获。

本文主要介绍的是Oracle不同版本在驱动运行中如何使用Java Date的相关问题的解答,如果你在计算机学习的过程中遇到Oracle不同版本在驱动运行中使用Java Date时,出现的类似的问题,你就可以点击以下的文章。

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

select ... from some_view union all select ... from some_table where datetime >= d1 and datetime< d2 and .... 底层使用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隐式地进行形如“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 clob实际相关代码的解析
  2. Oracle存储过程的返回列表如何以java来调用
  3. Oracle版本驱动中使用Java Date产生问题的解答
  4. Oracle clob实际相关代码的解析
  5. Oracle数据库备份和恢复的基本命令
责任编辑:佚名 来源: 互联网
相关推荐

2010-03-30 13:02:51

Oracle版本

2018-01-08 15:30:18

Linux命令date

2018-06-20 09:39:47

Oracle存储配置

2023-01-12 11:31:00

K8sToken

2010-10-28 15:38:24

Oracle to_d

2010-04-01 10:55:48

Oracle 数据类型

2011-06-20 14:00:26

Qt qmake

2010-03-30 15:54:27

Oracle date

2010-05-05 17:53:39

Oracle 8i

2021-11-11 09:01:01

Helm Chart Kubernetes

2010-04-21 13:21:24

Oracle时间

2021-02-06 17:55:41

微服务Maven版本控制

2010-03-30 12:30:45

Oracle Hibe

2011-09-08 18:34:33

WindowsXP驱动程序

2022-06-30 13:54:16

BottlesLinuxWindows

2019-06-14 11:15:27

WindowsLinuxWSL

2010-04-23 15:34:41

Oracle 数据库

2010-03-30 19:19:13

Oracle产品

2010-04-30 08:47:22

Oracle分页存储

2014-12-22 09:48:58

DBCAOracle 11
点赞
收藏

51CTO技术栈公众号