【发布时间】:2010-12-29 01:43:03
【问题描述】:
我有一个带有时间的DATE 列的表(与Oracle 中的往常一样,因为没有TIME 类型)。当我从 JDBC 查询该列时,我有两个选择:
- 使用 Oracle 的
to_date()手动转换值 - 使用
java.sql.Timestamp
这两种方法都有效,并且都有独特的可怕之处。我的问题是当我SELECTing 数据时。以下是两个示例查询:
select *
from TABLE
where TS between {ts '2009-12-08 00:00:00.000'} and {ts '2009-12-09 00:00:00.000'}
select *
from TABLE
where TS between trunc({ts '2009-12-08 00:00:00.000'}) and trunc({ts '2009-12-09 00:00:00.000'})
两个查询都有效,返回相同的结果并在EXPLAIN PLAN 中产生完全相同的输出。使用这个正确的索引。
仅查询一个运行 15 分钟,而第二个查询需要 0.031 秒。这是为什么?是否有一个中心位置来解决这个问题,或者我是否必须检查我对该列的所有查询并完全确定trunc() 在那里?当我需要选择到某一秒时,如何解决此问题?
[编辑] 表已分区,我在 Oracle 10.2.0 上。
【问题讨论】:
-
你的表分区了吗?当您将参数设置为时间戳时,Oracle JDBC 似乎没有使用分区修剪,原因我一直不明白。
-
+1 我也想了解这一点。这只发生在一张大桌子上吗?
-
好吧,我猜你不会注意到一张小桌子:)
-
正如您所指出的,使用 {ts ''} 语法使您的代码与数据库无关,但是有没有办法找出真正传递给数据库的 SQL 是什么?与数据库无关有多重要?如果您可以发布 EXPLAIN PLAN 结果,我们或许能够了解更多正在发生的事情。
-
Bob:解释计划显示完全相同的结果,即使我使用 TO_DATE()。
标签: performance oracle date jdbc timestamp