你好,我有一个对 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/