您好,我有一个对 Oracle 系统的查询,其中涉及一个视图,该视图通过将 TO_NUMBER() 应用于表主键来连接其他表。
如果我使用 TOAD 进行查询,查询速度非常快(800 个寄存器 1 秒)。如果我在 java 程序中通过 JDBC 使用字符串文字(不是参数化查询)执行相同的查询,时间也很好。
但是,如果我通过PreparedStatement 使用参数化查询,则查询需要 1 分钟才能获取相同的寄存器。我知道使用常量值会比使用参数产生不同的执行计划...但是如果我删除视图连接中的 TO_NUMBER 函数,参数化查询也会很快。
P.D.抱歉我的英语不好
检查参数中传入的Java变量的数据类型是否与Oracle数据类型兼容。当通过与 Oracle DATE 列进行比较的绑定变量传递 Java TIMESTAMP 时,我看到了与您类似的症状 - 文字字符串查询正常,PL/SQL 中的测试用例与(日期)绑定正常,Java 代码与不匹配不正常。
[编辑] 我认为自最初发布以来您已经提供了一些附加信息。了解来自不同环境(Java 与 Toad)的查询的稍微不同形式(绑定与文字)所发生的情况的最佳方法是在执行期间启用跟踪,并比较生成的跟踪文件中的执行路径。这将要求您有权访问数据库主机才能检索文件。
检查以确保有人没有设置属性 oracle.jdbc.defaultNChar=true
有时这样做是为了解决 unicode 问题,但这意味着所有列都被视为 nvarchar。如果你在 varchar 列上有索引,则不会使用它,因为 oracle 必须使用函数来转换字符编码。
这实际上是一个与 ORACLE 服务器端配置相关的问题,如果 origin 是 FORCE,只需将 Cursor_Sharing 更改为 EXACT