问题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:系统级动态参数,修改后立即生效共享内存池是 DMServer 在启动时从操作系统申请的一大片内存。在 DMServer 运行期间,经常会申请与释放小片内存,而直接向操作系统申请和释放内存时需要发出系统调用,可能会引起线程切换,降低系统运行效率。达梦采用共享内存池的方式:一次向操作系统申请一片较大内存,作为共享内存池。当系统在运行过程中需要申请小片内存时,可在共享内存池内进行申请,用完后再释放归还给共享内存池。
| 参数 | 当前值 | 类型 | 说明 |
|---|---|---|---|
MEMORY_POOL |
700 MB | IN FILE | 共享内存池初始大小,缺省为 500MB |
MEMORY_EXTENT_SIZE |
32 MB | IN FILE | 共享内存池每次扩展的大小 |
MEMORY_TARGET |
1000 MB | SYS | 共享内存池扩展后空闲时收缩回的目标大小 |
设置影响:
数据缓冲区是 DMServer 在将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的地方。这是 DMServer 至关重要的内存区域之一。达梦数据缓冲区分为 NORMAL、RECYCLE、FAST 三种类型。
| 参数 | 当前值 | 类型 | 说明 |
|---|---|---|---|
BUFFER |
4000 → 5000 MB | IN FILE | NORMAL 缓冲区大小,影响数据页缓存命中率 |
设置影响:
排序缓冲区提供数据排序所需要的内存空间。当用户执行 SQL 语句需要排序时,所使用的内存就是排序缓冲区提供的。
| 参数 | 当前值 | 类型 | 说明 |
|---|---|---|---|
SORT_BUF_SIZE |
10 MB | SESSION | 排序缓冲区大小 |
设置影响:
达梦为哈希连接和哈希分组设定了缓冲区。该缓冲区是个虚拟缓冲区——系统没有真正创建特定属于哈希缓冲区的内存,而是在进行哈希连接时,对哈希连接的数据量进行计算。如果计算出的数据量大小超过了哈希缓冲区的大小,则使用外存哈希方式。
| 参数 | 当前值 | 类型 | 说明 |
|---|---|---|---|
HJ_BUF_SIZE |
100 → 150 MB | SESSION | 哈希连接缓冲区大小 |
HAGR_BUF_SIZE |
100 MB | SESSION | 哈希分组缓冲区大小 |
设置影响:
第一步:修改配置文件
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
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
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_VALUE 的 SCOPE=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_POOL / MEMORY_TARGET(共享内存池):
SORT_BUF_SIZE(排序缓冲区):
HJ_BUF_SIZE(哈希连接缓冲区):
HAGR_BUF_SIZE(哈希分组缓冲区):
参数修改原则:
IN FILE)修改后需重启生效,动态参数(SESSION)可立即生效V$DM_INI 确认参数类型,选择正确的修改方式V$BUFFERPOOL、V$MEM_POOL、V$SORT_HISTORY 等视图监控效果文章
阅读量
获赞
