【发布时间】:2013-07-29 16:37:13
【问题描述】:
我有一个非常庞大的查询。它相当大,所以我不会在这里发布(它有 6 级嵌套查询,带有排序和分组)。查询有 2 个通过 PreparedStatement.setString(index, value) 传递给它的参数。当我通过 SQL Developer 执行查询时(手动将查询参数替换为实际值),查询运行大约 10 秒并返回大约 15000 行。但是,当我尝试使用带有变量的 PreparedStament 通过 java 程序运行它时,它会以ORA-01652(unable to extend temp segment) 失败。我尝试使用 java 程序中的简单语句 - 它工作正常。此外,当我使用不带变量的preparedStatement(不要使用setString(),而是手动指定参数)时,它也可以正常工作。
所以,我怀疑问题出在 PreparedStatemnt 参数中。
该参数的机制是如何工作的?为什么简单的语句可以正常工作,但准备好的语句却失败了?
【问题讨论】:
-
您使用的是什么版本的 Oracle?优化器处理绑定变量的方式在 10 到 11 之间发生了显着变化。
-
做一个“解释计划”看看发生了什么:stackoverflow.com/questions/4376329/…
-
我怀疑 jonearles 是对的……在 SQL Developer 中执行的解释计划(尽管对排除某些东西很有用)如果它在 10 秒内返回可能无济于事。 Java 中更有可能发生了一些时髦的事情。首先要检查的是您的查询是否相同...
-
2 jonearles:我使用的是 oracle 10g
-
对“oracle 变量绑定窥视”进行一些谷歌搜索这是一篇文章的链接。 dba-oracle.com/t_bind_variable_peeking_tips.htm 我的猜测是,oracle 正在使用不同的计划与准备好的语句和绑定参数。您可能需要向查询添加提示,以便它使用与使用文字运行查询时使用的相同索引等。您可以通过在 sqlplus 会话中使用变量来模拟与在您的 java 代码中所做的查询相同的问题。
标签: oracle jdbc prepared-statement