java - JDBC 在 Java 中查询速度慢,但在其他系统中查询速度慢 (TOAD)

标签 java performance oracle jdbc

你好,我有一个对 Oracle 系统的查询,其中涉及一个 View ,该 View 通过将 TO_NUMBER() 应用到表的主键来连接其他表。

如果我使用 TOAD 进行查询,则查询速度非常快(800 个 regs 仅需 1 秒)。如果我通过 JDBC 使用字符串文字(不是参数化查询)在 Java 程序中执行相同的查询,时间也很好。

但是如果我使用 PreparedStatement 的参数化查询,查询需要 1 分钟来获取相同的寄存器。我知道使用常量值会产生与使用参数不同的执行计划...但是如果我删除 View 连接中的 TO_NUMBER 函数,参数化查询也会很快。

  • 参数/TO_NUMBER() 联合是否阻止使用连接表的 PK 索引?
  • 是否有解决此问题的解决方法(我需要查询中的参数以及 TO_NUMBER 函数)?

PD抱歉我的英语不好

最佳答案

在没有其他信息的情况下,我们只能假设未使用索引并将 to_number() 函数应用于该列。如图this SO question ,类型转换可以防止优化器使用索引。

一般来说:

  • 当您向列添加函数时(即:to_number(id)),优化器将无法对该列使用常规索引,
  • 如果可能,您应该使用原始列。例如:而不是 WHERE trunc(col) = DATE '2009-08-27'你应该使用:WHERE col >= DATE '2009-08-27' AND col < DATE '2009-08-28'
  • 如果你真的必须将一个函数应用到一个列,你可以使用 function-based index

关于java - JDBC 在 Java 中查询速度慢,但在其他系统中查询速度慢 (TOAD),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1339549/

相关文章:

java - 将 JBoss EL 与 Websphere 结合使用

java - Kafka 消费者配置/性能问题

java - 从返回 xml 的请求中获取单个值的最佳方法?

asp.net - count(*) 真的很贵吗?

SQL 计数、非重复和分区

sql - Oracle RAC 和序列

java - 如何用Java解析日志文件?

java - 如何同时运行java 6和java 7

java - Java 8 中的可编辑 JComboBox 不会将 Enter 键转发到默认按钮

sql - Oracle 存储过程变量命名约定