You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle 10g出现ORA-04030错误 如何查询导致内存不足的SQL

ORA-04030高内存消耗SQL定位查询语句

ORA-04030为Oracle进程私有内存(PGA)分配不足触发的报错,可通过以下系统视图查询定位内存占用过高的SQL:

实时查询当前TOP10高PGA占用SQL

SELECT *
FROM (
    SELECT 
        s.sid,
        s.serial#,
        s.username,
        s.sql_id,
        sa.sql_text,
        ROUND(p.pga_alloc_mem/1024/1024,2) pga_alloc_mb,
        ROUND(p.pga_used_mem/1024/1024,2) pga_used_mb,
        ROUND(p.pga_max_mem/1024/1024,2) pga_max_mb
    FROM v$session s
    INNER JOIN v$sqlarea sa ON s.sql_id = sa.sql_id
    INNER JOIN v$process p ON s.paddr = p.addr
    ORDER BY p.pga_alloc_mem DESC
)
WHERE ROWNUM <= 10;

返回结果中pga_alloc_mb为进程当前分配的PGA总大小,数值越高对应SQL引发内存不足的概率越高。

查询历史时间段高PGA消耗SQL(需AWR功能正常开启)

SELECT *
FROM (
    SELECT 
        sql_id,
        sql_text,
        ROUND(MAX(pga_allocated)/1024/1024,2) max_pga_mb,
        TO_CHAR(begin_interval_time,'YYYY-MM-DD HH24:MI:SS') snap_start_time
    FROM dba_hist_sqlstat st
    INNER JOIN dba_hist_snapshot sn ON st.snap_id = sn.snap_id AND st.instance_number = sn.instance_number
    WHERE begin_interval_time BETWEEN TO_DATE('替换为报错开始时间','YYYY-MM-DD HH24:MI:SS') AND TO_DATE('替换为报错结束时间','YYYY-MM-DD HH24:MI:SS')
    GROUP BY sql_id, sql_text, begin_interval_time
    ORDER BY max_pga_mb DESC
)
WHERE ROWNUM <= 10;

该语句适用于报错会话已断开、无法查询实时视图的场景,需替换语句中的时间范围为报错前后1小时内的时间。

直接查询已触发ORA-04030的SQL记录(需开启SQL监控功能)

SELECT 
    sql_id,
    sql_text,
    ROUND(pga_allocated/1024/1024,2) pga_used_mb,
    TO_CHAR(last_refresh_time,'YYYY-MM-DD HH24:MI:SS') error_time
FROM v$sql_monitor
WHERE error_code = 4030
ORDER BY last_refresh_time DESC;

注意事项

  • 所有查询均需要DBA权限才可访问系统视图
  • 若查询未找到单条高内存消耗SQL,需进一步排查是否PGA_AGGREGATE_LIMIT参数设置过小,或是存在会话泄漏、大量小内存会话并发的情况

内容的提问来源于stack exchange,提问作者mickey_jee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 00:24:03