PreparedStatement和ORA-01652(无法扩展临时段)

时间:2013-07-29 18:37:29

标签: oracle jdbc prepared-statement

我有一个很大的查询。它相当大,所以我不会在这里发布它(它有6级嵌套查询,包括排序和分组)。 Query有2个参数通过PreparedStatement.setString(index, value)传递给它。当我通过SQL Developer执行我的查询(手动将查询参数替换为实际值)时,查询运行大约10秒并返回大约15000行。但是当我尝试使用带有varibales的PreparedStament通过java程序运行它时,它会失败ORA-01652(unable to extend temp segment)。我试过从java程序中使用简单的语句 - 它工作正常。另外,当我使用没有变量的prepareStatement时(不要使用setString(),但是手动指定参数)它也能正常工作。

因此,我怀疑问题出现在PreparedStatemnt参数中。

该参数的机制如何运作?为什么简单的陈述工作正常,但准备好的失败?

1 个答案:

答案 0 :(得分:1)

你可能遇到了绑定变量偷看的问题。

对于相同的查询,最佳计划可能会有很大不同,具体取决于实际的绑定变量。在10g中,Oracle基于所使用的第一个绑定变量集构建执行计划。 11g主要通过自适应游标共享来解决这个问题,这是一种为不同绑定变量创建多个计划的功能。

以下是解决此问题的一些想法:

使用文字这并不像人们想象的那么糟糕。如果您的查询的良好版本在10秒内运行,那么硬解析查询的开销将是微不足道的。但是你可能需要小心避免SQL注入。

强制进行硬分析 force Oracle to hard-parse every query有几种方法。一种方法是在查询中的一个表上调用DBMS_STATS,其中NO_INVALIDATE => FALSE。

禁用绑定变量查看/提示您可以通过删除相关的直方图或使用OldProgrammer提供的链接中的一个参数来完成此操作。这将稳定您的计划,但不一定会选择正确的计划。您可能还需要使用提示来选择正确的计划。但是,对于每种输入组合,您可能没有正确的计划。

升级至11g 这可能不是一个选项,但此问题是开始计划升级的另一个好理由。