java.sql.date,java.sql.timestamp谓词 - > Oracle分区数据类型

时间:2014-06-09 08:34:16

标签: java sql oracle jdbc database-partitioning

您好我们有大型Oracle列对象,我们使用数据类型 DATE

对其进行了分区

其中一个分区如下所示:

GCP_P1  TO_DATE(' 2011-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 83  M_DATA01    DISABLED    348132  15214   146 08.06.2014 02:20:40 1078    0

每个分区都是一周。

我们使用jdbc通过瘦客户端运行我们的sql。没有ORM只是纯粹的jdbc。

当我们的分区列的谓词项是java.sql.timestamp时,我们意识到查询不会从分区中受益。但是,当它是java.sql.date类型时,执行计划显示成功的分区访问。

所以例如我们的sql看起来像这样:

SELECT COUNT(1) FROM ATABLE WHERE PARTITIONED_COLUMN > ?

当我们的java语句是:

preparedStatement.setDate(...); // it benefits from partition

但是当它是这样的时候:

preparedStatement.setTimestamp(...); //it does not benefits from partition

我从Toad看他们。我经历过当它是java.sql.date时,它在oracle上被解释为DATE,当它是java.sql.timestamp时它被解释为TIMESTAMP

我使用以下sql语句跟踪捕获的jdbc日期类型

SELECT *
  FROM V$SQL_BIND_CAPTURE
WHERE WAS_CAPTURED = 'YES' AND LAST_CAPTURED BETWEEN SYSDATE-1/50 AND SYSDATE
ORDER BY LAST_CAPTURED DESC;

我的问题是你遇到过这样的问题吗?如果是这样,你会指导我一些文件。

2 个答案:

答案 0 :(得分:1)

您描述的案例记录在第8节 - 映射"Getting Started with the JDBC API"

的SQL和Java类型

8.3.12 DATE, TIME, and TIMESTAMP

  

因为标准Java类java.util.Date与任何一个都不匹配   这三种JDBC日期/时间类型完全相同(它包括DATE和   TIME信息但没有纳秒),JDBC定义了三个   java.util.Date的子类对应于SQL类型。他们是:

java.sql.Date

  

表示SQL DATE信息。小时,分钟,秒和   应将java.util.Date基类的毫秒字段设置为   零。如果提供给java.sql.Date的毫秒数   构造函数为负数,驱动程序将计算日期为   1970年1月1日之前的毫秒数。否则,日期是   计算为1月1日后指定的毫秒数,   1970。

的java.sql.Time

  

表示SQL TIME信息。年,月和日   java.util.Date基类的字段设置为1970年1月和   这是"零" Java时代的日期。

java.sql.Timestamp

  

用于SQL TIMESTAMP信息。该类通过添加扩展java.util.Date   一个纳秒的字段。

答案 1 :(得分:1)

oracle jdbc developers guide包含从jdbc类型到oracle数据类型的映射。由于其复杂性,DATE数据类型特有section。它有以下注释:

  

在Oracle Database 11g中,如果您有DATE列的索引   由SQL查询使用,然后获得更快更准确的结果   必须以下列方式使用setObject方法:

 Date d = parseIsoDate(val); 
 Timestamp t = new Timestamp(d.getTime());
 stmt.setObject(pos, new oracle.sql.DATE(t,(Calendar)UTC_CAL.clone()));