尝试分配 X 内存量时 sqlplus 进程内存不足

sqlplus out of process memory when trying to allocate X amount of memory

我们正在使用 sqlplus 在大型 table 上使用 sqlplus 从 oracle 卸载数据,每天有 500 多列和大约 1500 万条记录。 查询失败,因为 oracle 无法为结果集分配所需的内存。 微调 Oracle DB 服务器以增加内存分配被排除在外,因为它是跨团队使用的,而且很关键。 这是一个简单的 select,在列上有一个过滤器。 我有什么选择才能让它发挥作用?

1) 将我的查询分解为多个块,并 运行 在夜间批处理模式下进行查询。 如果是这样,如何分解 select 查询 2) 在大型 table 上使用 sqlplus 进行 select 查询时,是否可以使用任何优化技术? 3) 任何基于 java/ojdbc 的解决方案都可以将 select 分成块并减少数据库服务器上的负载?

非常感谢任何指点。

这是抛出的错误消息: ORA-04030: 尝试分配 169040 字节时进程内存不足(pga 堆、kgh 堆栈) ORA-04030: 尝试分配 16328 字节时进程内存不足 (koh-kghu sessi,pl/sql vc2)

ORA-4030 表示进程需要更多内存(SGA/PGA 中的 UGA,具体取决于服务器架构)来执行作业。

这可能是由于 RAM(专用服务器模式环境)不足、PGA 大小过小,或者可能是操作系统设置限制分配足够的 RAM。

此 MOS 说明描述了如何诊断和解决 ORA-04030 错误。

诊断和解决 ORA-4030 错误(文档 ID 233869.1)

您的选项 1 似乎在您的控制之中。分解查询将需要 query/data 的知识。数据中的一列可能有效;即

query1: select ... where col1 <= <value>
query2: select ... where col1 > <value>

...或者...您可能需要围绕该问题构建更多代码。

思考:查询是否涉及sorting/grouping?没有它你能活吗?这些操作占用更多的内存。