注册
达梦数据库内存结构理解
技术分享/ 文章详情 /

达梦数据库内存结构理解

何处惹尘埃 2026/07/31 294 1 0

问题14:达梦数据库内存结构理解。比如对于内存优化参数,buffer、memory、sort、hj、hagr等参数设置不同大小,会产生哪些影响?

一、达梦数据库内存架构概述

达梦数据库管理系统是一种对内存申请和释放操作频率很高的软件,如果每次对内存的使用都使用操作系统函数来申请和释放,效率会比较低,因此达梦加入了自身的内存管理机制。达梦数据库的内存结构主要包括内存池、缓冲区、排序区、哈希区等。

内存层次结构

操作系统内存
    └── 共享内存(dmserver进程)
            ├── 数据缓冲区(BUFFER / RECYCLE / FAST_POOL_PAGES)
            ├── 日志缓冲区(RLOG_BUF_SIZE)
            ├── SQL缓冲区(CACHE_POOL_SIZE)
            ├── 字典缓冲区(DICT_BUF_SIZE)
            ├── 共享内存池(MEMORY_POOL)
            │       ├── 排序区(SORT_BUF_SIZE)
            │       └── 哈希区(HJ_BUF_SIZE / HAGR_BUF_SIZE)
            └── 其他运行时内存池(会话内存池、虚拟机内存池等)

二、当前环境内存参数查询

执行命令

SELECT PARA_NAME, PARA_VALUE, PARA_TYPE FROM V$DM_INI WHERE PARA_NAME IN ('BUFFER', 'MEMORY_POOL', 'SORT_BUF_SIZE', 'HJ_BUF_SIZE', 'HAGR_BUF_SIZE', 'MEMORY_TARGET', 'MEMORY_EXTENT_SIZE');

实际输出

行号  PARA_NAME            PARA_VALUE  PARA_TYPE
----- -------------------- ----------- ---------
1     MEMORY_POOL          700         IN FILE
2     MEMORY_TARGET        1000        SYS
3     MEMORY_EXTENT_SIZE   32          IN FILE
4     BUFFER               4000        IN FILE
5     SORT_BUF_SIZE        10          SESSION
6     HJ_BUF_SIZE          100         SESSION
7     HAGR_BUF_SIZE        100         SESSION

参数类型说明

  • IN FILE:静态参数,修改后需重启数据库实例方可生效
  • SESSION:会话级动态参数,可在会话中修改,仅影响当前会话
  • SYS:系统级动态参数,修改后立即生效

三、各内存参数详解

3.1 共享内存池(MEMORY_POOL / MEMORY_TARGET / MEMORY_EXTENT_SIZE)

共享内存池是 DMServer 在启动时从操作系统申请的一大片内存。在 DMServer 运行期间,经常会申请与释放小片内存,而直接向操作系统申请和释放内存时需要发出系统调用,可能会引起线程切换,降低系统运行效率。达梦采用共享内存池的方式:一次向操作系统申请一片较大内存,作为共享内存池。当系统在运行过程中需要申请小片内存时,可在共享内存池内进行申请,用完后再释放归还给共享内存池。

参数 当前值 类型 说明
MEMORY_POOL 700 MB IN FILE 共享内存池初始大小,缺省为 500MB
MEMORY_EXTENT_SIZE 32 MB IN FILE 共享内存池每次扩展的大小
MEMORY_TARGET 1000 MB SYS 共享内存池扩展后空闲时收缩回的目标大小

设置影响

  • 设置过小:共享内存池扩展频繁,可能报错或性能下降
  • 设置过大:数据库启动时占用大量内存,但运行时更灵活

3.2 数据缓冲区(BUFFER)

数据缓冲区是 DMServer 在将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的地方。这是 DMServer 至关重要的内存区域之一。达梦数据缓冲区分为 NORMAL、RECYCLE、FAST 三种类型。

参数 当前值 类型 说明
BUFFER 4000 → 5000 MB IN FILE NORMAL 缓冲区大小,影响数据页缓存命中率

设置影响

  • 设置过小:缓冲页命中率低,磁盘 IO 频繁,查询性能下降
  • 设置过大:占用过多操作系统内存,可能导致内存不足

3.3 排序区(SORT_BUF_SIZE)

排序缓冲区提供数据排序所需要的内存空间。当用户执行 SQL 语句需要排序时,所使用的内存就是排序缓冲区提供的。

参数 当前值 类型 说明
SORT_BUF_SIZE 10 MB SESSION 排序缓冲区大小

设置影响

  • 设置过小:频繁外部排序(磁盘排序),性能急剧下降
  • 设置过大:每个排序操作占用更多内存,高并发下可能导致内存不足

3.4 哈希区(HJ_BUF_SIZE / HAGR_BUF_SIZE)

达梦为哈希连接和哈希分组设定了缓冲区。该缓冲区是个虚拟缓冲区——系统没有真正创建特定属于哈希缓冲区的内存,而是在进行哈希连接时,对哈希连接的数据量进行计算。如果计算出的数据量大小超过了哈希缓冲区的大小,则使用外存哈希方式。

参数 当前值 类型 说明
HJ_BUF_SIZE 100 → 150 MB SESSION 哈希连接缓冲区大小
HAGR_BUF_SIZE 100 MB SESSION 哈希分组缓冲区大小

设置影响

  • 设置过小:哈希连接/分组频繁使用外存(临时表空间),性能下降
  • 设置过大:单个连接占用大量内存,高并发时内存不足

四、参数调整实操

4.1 修改静态参数 BUFFER(需重启生效)

第一步:修改配置文件

CALL SP_SET_PARA_VALUE(2, 'BUFFER', 5000);

输出

DMSQL 过程已成功完成

第二步:验证配置文件已修改

SELECT NAME, VALUE, SYS_VALUE, FILE_VALUE FROM V$PARAMETER WHERE NAME = 'BUFFER';

实际输出

行号  NAME   VALUE  SYS_VALUE  FILE_VALUE
----- ------ ------ ---------- ----------
1     BUFFER 4000   4000       5000

FILE_VALUE 显示 5000,表示配置文件已修改,但内存中的值仍为 4000(需重启生效)。

第三步:重启实例

pkill -9 -f "dmserver.*5239" nohup /home/dmdba/dmdbms/bin/dmserver /home/dmdba/dmdata/test/TESTDB/dm.ini > /home/dmdba/dmdata/test/dm.log 2>&1 &

重启过程中遇到旧进程未终止的问题,经强制终止后重新启动成功。

第四步:重启后验证

SELECT PARA_NAME, PARA_VALUE, PARA_TYPE FROM V$DM_INI WHERE PARA_NAME = 'BUFFER';

实际输出

行号  PARA_NAME  PARA_VALUE  PARA_TYPE
----- ---------- ----------- ---------
1     BUFFER     5000        IN FILE

4.2 修改动态参数 HJ_BUF_SIZE(立即生效)

ALTER SYSTEM SET 'HJ_BUF_SIZE' = 150 BOTH;

输出

DMSQL 过程已成功完成

验证修改结果

SELECT PARA_NAME, PARA_VALUE, PARA_TYPE FROM V$DM_INI WHERE PARA_NAME = 'HJ_BUF_SIZE';

实际输出

行号  PARA_NAME    PARA_VALUE  PARA_TYPE
----- ------------ ----------- ---------
1     HJ_BUF_SIZE  150         SESSION

4.3 最终验证两个参数

SELECT PARA_NAME, PARA_VALUE, PARA_TYPE FROM V$DM_INI WHERE PARA_NAME IN ('BUFFER', 'HJ_BUF_SIZE');

实际输出

行号  PARA_NAME    PARA_VALUE  PARA_TYPE
----- ------------ ----------- ---------
1     BUFFER       5000        IN FILE
2     HJ_BUF_SIZE  150         SESSION

五、参数修改错误分析

执行命令(错误示例):

CALL SP_SET_PARA_VALUE(1, 'BUFFER', 5000);

错误输出

[-839]:不能修改静态配置参数的内存值

原因分析BUFFER 是静态参数(IN FILE),不能直接修改内存中的值。SP_SET_PARA_VALUESCOPE=1 表示同时修改内存和配置文件,静态参数不支持此操作。

正确方式

  • 使用 SCOPE=2(仅修改配置文件):CALL SP_SET_PARA_VALUE(2, 'BUFFER', 5000);
  • 或使用 ALTER SYSTEM SET 'BUFFER' = 5000 SPFILE;
  • 然后重启实例使修改生效

六、参数调整影响总结

参数 原始值 修改后 参数类型 影响说明
BUFFER 4000 MB 5000 MB IN FILE 增大可提高数据页缓存命中率,减少物理读,需重启生效
HJ_BUF_SIZE 100 MB 150 MB SESSION 增大可减少哈希连接的外存使用,立即生效
MEMORY_POOL 700 MB - IN FILE 共享内存池初始大小,影响内存扩展灵活性
SORT_BUF_SIZE 10 MB - SESSION 排序缓冲区大小,过小会导致频繁外部排序
HAGR_BUF_SIZE 100 MB - SESSION 哈希分组缓冲区大小,过小会导致外存哈希分组

七、核心问题回答

问题:buffer、memory、sort、hj、hagr 等参数设置不同大小,会产生哪些影响?

  1. BUFFER(数据缓冲区)

    • 调大:提升数据页缓存命中率,减少磁盘 I/O,查询性能提升
    • 调小:缓存命中率下降,物理读增加,查询性能下降
    • 建议:占总内存的 40%~60%(当前 5000MB,约占总内存 38%)
  2. MEMORY_POOL / MEMORY_TARGET(共享内存池)

    • 调大:减少内存扩展次数,运行更稳定,但启动时占用更多内存
    • 调小:扩展频繁,可能触发内存不足错误
    • 建议:根据并发量和 SQL 复杂度调整,当前 700/1000MB 配置合理
  3. SORT_BUF_SIZE(排序缓冲区)

    • 调大:减少外部排序(磁盘排序),排序操作性能提升
    • 调小:频繁外部排序,排序性能急剧下降
    • 建议:2~32MB,当前 10MB 适中
  4. HJ_BUF_SIZE(哈希连接缓冲区)

    • 调大:减少哈希连接使用临时表空间,连接性能提升
    • 调小:频繁外存哈希,连接性能下降
    • 建议:10~100MB,当前已调整为 150MB,适合哈希连接较多的场景
  5. HAGR_BUF_SIZE(哈希分组缓冲区)

    • 调大:减少分组聚合操作使用临时表空间
    • 调小:分组聚合频繁外存操作,性能下降
    • 建议:10~100MB,当前 100MB 适中
  6. 参数修改原则

    • 静态参数(IN FILE)修改后需重启生效,动态参数(SESSION)可立即生效
    • 修改前通过 V$DM_INI 确认参数类型,选择正确的修改方式
    • 调整后通过 V$BUFFERPOOLV$MEM_POOLV$SORT_HISTORY 等视图监控效果
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服