达梦:内存占用高排查SQL

达梦数据库 SQL 查询分析与说明

select
A.creator,B.sql_text,
trunc(sum(a.total_size/1024/1024)) "分配大小(M)",
trunc(sum(a.DATA_size/1024/1024)) "占用大小(M)"
from v$mem_pool A, v$sessions B WHERE A.CREATOR=B.THRD_ID
GROUP BY A.CREATOR,B.SQL_TEXT ORDER BY 3 DESC;
查询功能解析
SELECT 
  A.creator,                    -- 内存池创建者(线程ID)
  B.sql_text,                   -- 会话当前执行的SQL语句
  TRUNC(SUM(A.total_size/1024/1024)) "分配大小(M)",  -- 内存总分配量(MB)
  TRUNC(SUM(A.DATA_size/1024/1024)) "占用大小(M)"    -- 内存实际占用量(MB)
FROM 
  v$mem_pool A,                -- 内存池动态视图
  v$sessions B                 -- 会话动态视图
WHERE 
  A.CREATOR = B.THRD_ID         -- 关联条件:内存池创建者=会话线程ID
GROUP BY 
  A.CREATOR, B.SQL_TEXT         -- 按创建者和SQL文本分组
ORDER BY 
  3 DESC;                      -- 按分配大小降序排序

关键组件说明
  1. 数据源视图

    • v$mem_pool:监控数据库共享内存池的分配状态
      • creator:创建内存池的线程ID
      • total_size:分配给该线程的总内存字节数
      • DATA_size:实际存储数据的内存字节数
    • v$sessions:记录活动会话的实时信息
      • THRD_ID:会话对应的操作系统线程ID
      • sql_text:当前执行的SQL语句原文
  2. 核心计算逻辑

    • 内存转换公式
      MB = 字节数 1024 × 1024 \text{MB} = \frac{\text{字节数}}{1024 \times 1024} MB=1024×1024字节数
    • 聚合统计:对同一创建者+SQL组合的多个内存块进行SUM求和
    • 取整处理TRUNC函数去除小数部分,保留整数MB值
  3. 关联机制

    通过CREATOR=THRD_ID建立连接,实现 线程级内存使用SQL语句 的精确映射


输出结果说明
列名说明诊断意义
creator内存池创建者(线程ID)定位高内存消耗的线程
sql_text会话正在执行的SQL原文识别内存密集型SQL
分配大小(M)总分配内存量(MB)内存申请规模评估
占用大小(M)实际使用内存量(MB)内存利用效率指标

关键分析点

  • 当$ \text{分配大小} \gg \text{占用大小}$ 时,表明内存碎片率高
  • 单一SQL出现高分配值,需优化语句或调整缓存配置
  • 可结合ORDER BY 3 DESC识别TOP内存消耗操作

典型应用场景
  1. 内存泄漏排查
    持续监控特定线程的内存分配/占用比,若分配量持续增长但占用量不变则存在泄漏
  2. SQL性能优化
    识别高内存占用的SQL(如未使用绑变量的循环语句)
    -- 示例:需优化的高内存SQL
    BEGIN
      FOR i IN 1..10000 LOOP
        EXECUTE IMMEDIATE 'INSERT INTO t VALUES('||i||')';
      END LOOP;
    END;
    
  3. 缓存池扩容依据
    当多个会话出现高分配值时,需扩大SQL缓冲区:
    ALTER SYSTEM SET 'MEMORY_POOL' = 2048 SCOPE=BOTH;
    

相关问题

  1. 如何解读分配大小(M)占用大小(M)的差值?
  2. v$mem_pool中的total_size是否包含系统保留内存?
  3. 达梦数据库有哪些策略可优化SQL内存占用?
: SQL查询顺序:先FROM+WHERE,再SELECT,最后ORDER BY
SQL结果集缓存机制及缓冲区优化原则
达梦数据库安装参数中内存占比优化参数 -mp的作用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值