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

Oracle PreparedStatement和ORA-01652(无法扩展临时段),oracle,jdbc,prepared-statement,Oracle,Jdbc,Prepared Statement,我有一个很大的疑问。它相当大,所以我不会在这里发布它(它有6层嵌套查询,带有排序和分组)。查询有两个参数,通过PreparedStatement.setString(index,value)传递给它。当我通过SQL Developer执行查询时(手动将查询参数替换为之前的实际值),查询运行大约10秒,并返回大约15000行。但是,当我尝试使用带有varibales的PreparedStament通过java程序运行它时,由于ORA-01652(无法扩展临时段)而失败。我试着使用java程序中的简

我有一个很大的疑问。它相当大,所以我不会在这里发布它(它有6层嵌套查询,带有排序和分组)。查询有两个参数,通过
PreparedStatement.setString(index,value)
传递给它。当我通过SQL Developer执行查询时(手动将查询参数替换为之前的实际值),查询运行大约10秒,并返回大约
15000
行。但是,当我尝试使用带有varibales的PreparedStament通过java程序运行它时,由于
ORA-01652(无法扩展临时段)
而失败。我试着使用java程序中的简单语句——它工作得很好。另外,当我使用不带变量的preparedStatement时(不要使用
setString()
,而是手动指定参数),它也可以正常工作

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


这些参数的机制是如何工作的?为什么简单语句工作正常,但准备好的语句失败了?

您可能在绑定变量窥视方面遇到了问题

对于同一查询,最佳计划可能会因实际绑定变量的不同而显著不同。在10g中,Oracle根据使用的第一组绑定变量构建执行计划。11g主要通过自适应游标共享解决了这个问题,该功能为不同的绑定变量创建多个计划

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

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

强制进行硬解析有几种方法可以解决此问题。一种方法是在查询中的一个表上调用DBMS_STATS,而不使用NO_INVALIDATE=>FALSE

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


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

您使用的Oracle版本是什么?优化器处理绑定变量的方式在10到11之间发生了显著的变化。做一个“解释计划”看看发生了什么:我怀疑jonearles是对的。。。在SQLDeveloper中执行的解释计划(尽管对于排除这些内容很有用)如果在10秒内返回,可能不会有帮助。更有可能的是,Java中正在发生一些古怪的事情。但是要检查的第一件事是你的查询是相同的……2 jonearles:我正在使用oracle 10g在“oracle变量绑定窥视”上做一些谷歌搜索这里是一篇文章的链接。我的猜测是oracle正在使用一个不同的计划,其中包含预处理语句和绑定参数。您可能需要向查询添加一个提示,以便它使用与使用文本运行查询时使用的相同索引等。您可以模拟在sqlplus会话中使用变量进行查询的相同问题,就像在java代码中所做的一样。