您好我们有大型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;
我的问题是你遇到过这样的问题吗?如果是这样,你会指导我一些文件。
答案 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()));