将Oracle DATE列修改为TIMESTAMP时必须考虑的因素

时间:2014-11-05 23:40:34

标签: oracle date jdbc timestamp database-performance

我正在使用的系统使用oracle 11 db并且有一个使用JDBC的java实现的后端。

系统存在一个主要性能问题:

oracle db索引了DATE列,但java后端像这样访问db

String sql = "SELECT foo FROM bar WHERE a_date > ?";
// ... prepare the statement
statement.setTimestamp(1, new Timestamp());

然后由于statement.setTimestamp,Oracle不会使用索引并回退到全表扫描。

第一个解决方案:

所以我已经将后端的访问权限从 statement.setTimestamp 更改为 statement.setDate 。 性能已得到改进,现在使用了DATE索引,但现在我丢失了timestamp数据类型的准确性,并且只获得了java.sql.Date类型的日精度。

因此,第一个解决方案对我的系统无法使用。

第二个解决方案:

我不使用 statement.setTimestamp 更改java后端,并更改oracle db的所有DATE列,如下面的sql命令示例所示:

ALTER TABLE <table_1> MODIFY <date_column> TIMESTAMP;

现在我的问题:

将Oracle DATE列修改为TIMESTAMP

时必须考虑的因素

我认为重要方面的清单是完美的。

这是我将Oracle DATE列迁移到TIMESTAMP的&#34; CHECKLIST的初稿

1。创建/插入

2。阅读/选择

第3。更新/更新

4。删除/删除

5。 TO_DATE()

select * from table where crea_time between TO_DATE( '10.2014', 'MM.yyyy' ) and TO_DATE( '12.2014', 'MM.yyyy' ) ;

6。 TRUNC()

select TRUNC( crea_time ) from table;

输出crea_time数据类型DATE 05.11.2014 00:00:00 输出crea_time数据类型TIMESTAMP 05.11.2014 00:00:00

7。 TO_CHAR()

select to_char( crea_time,'hh24miss' ) from table;

输出数据类型DATE 140612 输出数据典型TIMESTAMP 140612

8。 NESTED - TRUNC(TO_DATE())

select TRUNC(TO_DATE( crea_time), 'YEAR') from table;

输出crea_time数据类型DATE 01.01.2014 00:00:00 输出crea_time数据类型TIMESTAMP ORA-01830: 01830. 00000 - &#34;日期格式图片在转换整个输入字符串之前结束&#34; *原因:
*行动: 解决方案&gt;&gt;&gt;从表中选择TRUNC(TO_TIMESTAMP(crea_time),&#39; YEAR&#39;); 输出crea_time数据类型TIMESTAMP 01.01.2014 00:00:00

9。添加一天/小时/分钟

select crea_time+1 from table;

输出数据类型DATE 06.11.2014 14:06:12

输出数据类型为TIMESTAMP 06.11.2014 14:06:12

10。 MIN()/ MAX()

SELECT MIN(crea_time) FROM table;

输出数据类型DATE 05.11.2014 14:06:12 输出数据典型TIMESTAMP 05.11.2014 14:06:12,000000000

请原谅我的英语不好。

0 个答案:

没有答案