【发布时间】:2015-05-07 08:13:30
【问题描述】:
我正在使用 java 和 JDBC 调用 Oracle 数据库,如下所示:
PreparedStatement prep=c.prepareStatement(
"SELECT a.user FROM data a where a.start_time >=? " +
"and a.end_time <=? and a.operation='UPDATE USER'");
prep.setString(1, 02-MAR-15);
prep.setString(2, 03-MAR-15);
ResultSet rs=prep.executeQuery();
此查询返回 560 个值需要 44 秒以上。
这是在 SQL Developer 中运行的相同查询:
SELECT a.user FROM data a where a.start_time >='02-MAR-15'
and a.end_time <='03-MAR-15' and a.operation='UPDATE USER';
这需要不到 4 秒。
我不明白为什么第二个速度这么快。
【问题讨论】:
-
你能发布查询的解释计划吗?
-
start_time 和 end_time 字段的数据库是什么?您将它们视为字符串,但它们是 DATE 类型,不是吗?如果是这样,那么您需要在绑定参数时使用正确的数据类型。
-
在查询运行时检查 v$sql_plan。 Oracle 也有类似“环境”的东西,它可以影响 exec。计划。可能是 optimizer_goal、区分大小写、根据国家字符集排序甚至是 io 缓冲区的大小。
-
@OldProgrammer start_time 和 end_time 都是时间戳我尝试使用时间戳作为数据类型但没有任何改进,还尝试了 a.start_time >=to_timestamp(?) 并得到了相同的结果
标签: java oracle jdbc oracle-sqldeveloper