【问题标题】:sqlplus out of process memory when trying to allocate X amount of memorysqlplus 尝试分配 X 量内存时进程内存不足
【发布时间】:2016-11-11 01:50:05
【问题描述】:

我们正在使用 sqlplus 在一个包含 500 多列和每天大约 1500 万条记录的大表上使用 sqlplus 从 oracle 卸载数据。 查询失败,因为 oracle 无法为结果集分配所需的内存。 排除了微调 oracle DB 服务器以增加内存分配的可能性,因为它在团队中使用并且非常重要。 这是一个在列上带有过滤器的简单选择。 我有哪些选择才能让它发挥作用?

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

任何指针都非常感谢。

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

【问题讨论】:

  • 确切的错误信息和错误编号是什么?
  • “卸载”。这是出于存档目的吗?像数据泵这样的东西会起作用吗?
  • 它是每晚卸载到目标数据库而不是存档。

标签: oracle sqlplus


【解决方案1】:

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

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

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

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

【讨论】:

  • 我认为 DBA 不会准备干预 oracle 设置的默认值。我们是否知道默认值设置对于获取 1500 万条记录的 sqlplus 客户端应用程序是否不够好?此外,我在文章中没有看到任何关于任何基准测试的具体细节。
  • 不是SQLPLUS的问题。当您使用 SQLPLUS 连接到数据库时,Oracle 将创建一个服务器进程来满足您的请求。服务器进程无法获取从 PGA 分配的内存(由内存参数控制)。
  • 我明白这一点。这就是为什么我说 DBA 可能还没有准备好更改在 oracle 服务器上设置的默认值,除非我提供一些确凿的事实和数据,说明在 oracle DB 上触发的进程由 sqplplus 客户端的查询执行将占用多少内存等等
【解决方案2】:

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

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

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

思考:查询是否涉及排序/分组?没有它你能活吗?这些操作会占用更多内存。

【讨论】:

    猜你喜欢
    • 2021-11-01
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    相关资源
    最近更新 更多