Java的preparedstatement比SQL Developer慢

4

我正在使用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();

这个查询需要超过44秒才能返回560个值。

这是在SQL开发者中运行的相同查询:

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秒钟。

我不理解为什么第二个会跑得更快。


2
你能发布查询的执行计划吗? - mmmmmpie
开始时间和结束时间字段的数据库是什么?您将它们视为字符串,但它们是日期类型,是吗?如果是这样,那么绑定参数时需要使用正确的数据类型。 - OldProgrammer
查询正在运行时,可以检查v$sql_plan。Oracle还有类似于“环境”的东西,它可以影响执行计划。这可能是optimizer_goal、大小写敏感性、按国家字符集排序甚至是io缓冲区的大小。 - ibre5041
@OldProgrammer start_time 和 end_time 都是时间戳。我尝试使用时间戳作为数据类型,但没有改进。我还尝试过 a.start_time >=to_timestamp(?),结果也相同。 - agalli
2个回答

2

我曾使用旧版的JDBC驱动程序,使用的是9i版本的驱动程序,而数据库是11g版本。

我更新了JDBC驱动程序后,现在JDBC调用的速度与SQL Developer中一样快。


0
我曾经遇到同样的问题,使用setInt而不是setString可以解决问题。
在Oracle开发者中,选择需要0.07秒,在Java中使用预处理语句需要0.7秒至4秒不等。
我使用的是ojdbc6 11.2.0.4版本。
更新的驱动程序(ojdbc8 12.2或18.3)消除了差异,但在两种情况下也略微慢一些(约1秒)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接