?
如何收集有关进程实际正在执行的任务的信息
这部分将只讨论 Oracle Server 进程。通过前面介绍的方法,您应该可以确定一个或多个 Oracle Server 进程导致了内存消耗。请记住,并非总是出现 ORA-4030 的进程导致了内存消耗,这个进程可能只是无法申请到需要的内存而已。
?
对于不断增加内存使用的进程,我们可以在其运行时进行查看以下方面的信息:
您可以使用以下查询检查 v$sqlarea 从而找到进程正在执行的 SQL:SQL> select
sql_text
from
v$sqlarea a, v$session s
where a.address = s.sql_address and
s.sid =
?
我们可以做heapdump,并将结果提交给 Oracle 技术支持:
?
SQL> select PID from v$process p, v$session s where p.addr=s.paddr and sid=
SQL> oradebug setorapid
有关避免此错误的一般建议
如上所述,一些操作需要大量的内存。对于排序问题,减少 SORT_AREA_SIZE 会有所帮助。Oracle Server 进程会将 PGA 中的 SORT_AREA_SIZE 字节分配给排序操作。如果完成搜索需要更多内存,服务器进程将会使用temporary segment。这意味着,减少 SORT_AREA_SIZE 会对需要大量排序操作的查询性能产生影响。
对于 9i 及更高版本,通过将参数 WORKAREA_SIZE_POLICY 设置为 AUTO,以及在初始化文件中指定 PGA_AGGREGATE_TARGET 的大小,即可启用自动 SQL 执行内存管理功能。使用自动 PGA 内存管理将有助于减少发生 ORA-4030 错误的可能性。请注意,OpenVMS 操作系统在Oracle 9i版本上不支持 PGA_AGGREGATE_TARGET,但是在 Oracle 10g 版本上是支持的。有关更多详细信息,请参阅以下文档:
?
"Performance Issues After Increasing Workload",
"Automatic PGA Memory Managment",
"Top Oracle 9i init.ora Parameters Affecting Performance"
PL/SQL 程序也可分配大量内存,因此可能需要重写应用程序的某些部分。尽管 PL/SQL 表非常容易使用,但它确实需要在 PGA 中分配内存。
查看 optimizer 策略,一些访问路径可能会因排序操作、较多行上的函数使用等原因而需要更多内存。
在某些操作系统上(例如 Microsoft Windows),可能要降低 SGA 的大小以便于 PGA 获得更大的内存。
确保您的操作系统和 Oracle 限制设置合理。
确保有足够的可用内存(物理内存和交换空间)。