注册
创建定时作业监控占用内存较高的SQL
技术分享/ 文章详情 /

创建定时作业监控占用内存较高的SQL

### 2026/07/31 172 0 0

经常遇到项目中达梦数据库OOM问题,大部分都是个别SQL执行期间占用内存较大导致,可通过以下方式创建定时作业,定时抓取实时会话中占用内存比较高的SQL语句记录到数据表中,当出现OOM问题后,可通过记录结果进行分析,定位是哪些SQL语句占用的内存。
1、创建SQL_HIS表用于记录占用内存比较高的SQL信息

create table SQL_HIS
    (
        MEM_MB    NUMBER,
        TIME_S    INTEGER,
        USER_NAME VARCHAR(128),
        SQL_TEXT  VARCHAR(32767),
        CLNT_IP   VARCHAR(300),
        SESS_TIME INTEGER,
        TIME1     TIMESTAMP
    );

2、查询实时活跃会话占用内存较高的前5条插入SQL_HIS表中

insert into SQL_HIS  SELECT CAST( M.TS * 1.0 / 1024 / 1024 AS NUMBER(38, 2)) AS "MEM_MB",
          DATEDIFF(SS, LAST_RECV_TIME, SYSDATE)            AS "TIME_S",
          USER_NAME,
          DBMS_LOB.SUBSTR(SF_GET_SESSION_SQL(SESS_ID)) AS "SQL_TEXT",
          THRD_ID || '  ' || APPNAME || '  ' ||        CLNT_IP,
          DATEDIFF(SS, LAST_SEND_TIME, SYSDATE)        AS "SESS_TIME"   ,
          sysdate     
     FROM V$SESSIONS              S
LEFT JOIN (SELECT SUM(TOTAL_SIZE) TS,
                   CREATOR
              FROM V$MEM_POOL
          GROUP BY CREATOR) M
       ON S.THRD_ID = M.CREATOR
       where   s.state='ACTIVE'
 ORDER BY "MEM_MB" DESC limit 5 ;

3、查询SQL_HIS表确认数据插入正常

 select * from SQL_HIS;

4、将第二步的插入语句配置为定时作业,可配置为每5分钟执行一次

call SP_CREATE_JOB('SQL_MON',1,0,'',0,0,'',0,'');

call SP_JOB_CONFIG_START('SQL_MON');

call SP_ADD_JOB_STEP_EX('SQL_MON', 'B1', 0, 'insert into SQL_HIS  SELECT CAST( M.TS * 1.0 / 1024 / 1024 AS NUMBER(38, 2)) AS "MEM_MB",
          DATEDIFF(SS, LAST_RECV_TIME, SYSDATE)            AS "TIME_S",
          USER_NAME,
          DBMS_LOB.SUBSTR(SF_GET_SESSION_SQL(SESS_ID)) AS "SQL_TEXT",
          THRD_ID || ''  '' || APPNAME || ''  '' ||        CLNT_IP,
          DATEDIFF(SS, LAST_SEND_TIME, SYSDATE)        AS "SESS_TIME"   ,
          sysdate     
     FROM V$SESSIONS              S
LEFT JOIN (SELECT SUM(TOTAL_SIZE) TS,
                   CREATOR
              FROM V$MEM_POOL
          GROUP BY CREATOR) M
       ON S.THRD_ID = M.CREATOR
       where   s.state=''ACTIVE''
 ORDER BY "MEM_MB" DESC limit 5 ;
 COMMIT;', 0, 1, 0, 0, NULL, 0, '');

call SP_ADD_JOB_SCHEDULE('SQL_MON', 'D1', 1, 1, 1, 0, 5, '00:00:00', '23:59:59', '2026-07-31 09:47:29', NULL, '');

call SP_JOB_CONFIG_COMMIT('SQL_MON');

call SP_JOB_SET_SCHEMA('SQL_MON', 'SYSDBA');
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服