【问题标题】:Java preparedstatement slower than sql developerJavapreparedstatement 比 sql developer 慢
【发布时间】: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


【解决方案1】:

我使用的是旧的 JDBC 驱动程序,我使用的是 9i 版本的驱动程序,DB 是 11g。

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

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,并尽可能使用setInt 而不是setString 来解决问题。
    在 Oracle 开发人员中选择需要 0.07 秒,而在 Java 中使用准备好的语句需要 0.7 秒与 4 秒。
    我使用了 ojdbc6 11.2.0.4。
    较新的驱动程序(ojdbc8 12.2 或 18.3)消除了差异,但在两种情况下的工作速度都稍慢(约 1 秒)。

    【讨论】:

      猜你喜欢
      • 2021-08-09
      • 1970-01-01
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多