达梦数据库 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; -- 按分配大小降序排序
关键组件说明
-
数据源视图
v$mem_pool
:监控数据库共享内存池的分配状态creator
:创建内存池的线程IDtotal_size
:分配给该线程的总内存字节数DATA_size
:实际存储数据的内存字节数
v$sessions
:记录活动会话的实时信息THRD_ID
:会话对应的操作系统线程IDsql_text
:当前执行的SQL语句原文
-
核心计算逻辑
- 内存转换公式:
MB = 字节数 1024 × 1024 \text{MB} = \frac{\text{字节数}}{1024 \times 1024} MB=1024×1024字节数 - 聚合统计:对同一创建者+SQL组合的多个内存块进行
SUM
求和 - 取整处理:
TRUNC
函数去除小数部分,保留整数MB值
- 内存转换公式:
-
关联机制
通过
CREATOR=THRD_ID
建立连接,实现 线程级内存使用 ↔ SQL语句 的精确映射
输出结果说明
列名 | 说明 | 诊断意义 |
---|---|---|
creator | 内存池创建者(线程ID) | 定位高内存消耗的线程 |
sql_text | 会话正在执行的SQL原文 | 识别内存密集型SQL |
分配大小(M) | 总分配内存量(MB) | 内存申请规模评估 |
占用大小(M) | 实际使用内存量(MB) | 内存利用效率指标 |
关键分析点:
- 当$ \text{分配大小} \gg \text{占用大小}$ 时,表明内存碎片率高
- 单一SQL出现高分配值,需优化语句或调整缓存配置
- 可结合
ORDER BY 3 DESC
识别TOP内存消耗操作
典型应用场景
- 内存泄漏排查
持续监控特定线程的内存分配/占用比,若分配量持续增长但占用量不变则存在泄漏 - SQL性能优化
识别高内存占用的SQL(如未使用绑变量的循环语句)-- 示例:需优化的高内存SQL BEGIN FOR i IN 1..10000 LOOP EXECUTE IMMEDIATE 'INSERT INTO t VALUES('||i||')'; END LOOP; END;
- 缓存池扩容依据
当多个会话出现高分配值时,需扩大SQL缓冲区:ALTER SYSTEM SET 'MEMORY_POOL' = 2048 SCOPE=BOTH;
相关问题
- 如何解读
分配大小(M)
与占用大小(M)
的差值? v$mem_pool
中的total_size
是否包含系统保留内存?- 达梦数据库有哪些策略可优化SQL内存占用?
-
: SQL查询顺序:先FROM+WHERE,再SELECT,最后ORDER BY
- SQL结果集缓存机制及缓冲区优化原则
-
达梦数据库安装参数中内存占比优化参数
-mp
的作用