DM服务器使用的内存大概分为3个部分
缓冲区:
- 数据缓冲区
- 日志缓冲区
- 字典缓冲区
- Sql缓冲区
内存池:
- 共享内存池
- 其他运行时内存池
其他内存区:
- 排序区
- Hash区
-
共享内存
达梦是单进程多线程的架构
共享内存是 dmserver启动时,从操作系统中申请的一大片内存,可以在需要的时候进行申请或释放
查看内存相关参数
SQL> l
1 select para_name,para_value from v$dm_ini where para_name like '%MEMORY%';
2*
SQL> /
行号 PARA_NAME PARA_VALUE
---------- ---------------------- ----------
1 MAX_OS_MEMORY 100
2 MEMORY_POOL 133
3 MEMORY_N_POOLS 1
4 MEMORY_TARGET 0
5 MEMORY_EXTENT_SIZE 1
6 MEMORY_LEAK_CHECK 0
7 MEMORY_MAGIC_CHECK 1
8 MEMORY_BAK_POOL 4
9 HUGE_MEMORY_PERCENTAGE 50
10 MAX_SESSION_MEMORY 0
memory_pool 公共池
memory_n_pool 共享内存池个数
memory_target 共享内存总大小 0:不限制
负责为其他内存池已经达到其目标大小后的扩展提供内存
-
数据缓冲区
在将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的地方。
BUFFER存在三条链来管理被缓冲的数据页
- “自由链”
- “LRU”链
- ”脏“链
数据缓冲区有四种类别
- NORMAl(默认值,普通页) :对应参数:buffer单位M
- Keep:很少或是几乎不怎么被淘汰出去的(普通页) 对应参数:keep单位M。
- Fast:常驻缓冲区,回滚页(用户不能指定)对应参数:fast_pool_pages数据页总数.
- Recycle:临时表的数据页,正常淘汰。(用户不能指定)对应参数:RECYCLE单位M。
和oracle的区别:
- Oracle:recycle和keep里面存的表的数据页。
- DM:RECYCLE和keep存的是表空间的数据页。Dm里面,用户不能指定使用recycle和fast缓冲区。
修改参数的方式:
- SP_set_para_value(scope,para_name,para_value);
修改整型参数 scope: 1 动态参数 2 静态参数
SQL> l
1 SP_set_para_value(2,'KEEP',16);
2*
SQL> /
DMSQL 过程已成功完成
SP_set_para_string_value:修改字符串类型
SP_set_para_double_value: 修改浮点类型
- Alter system set para_name=para_value
- 利用控制台工具修改
查看参数类型
SQL> select para_name,para_value,para_type from v$dm_ini where para_name like '%BUFFER%';
行号 PARA_NAME PARA_VALUE PARA_TYPE
---------- ------------------- ---------- ---------
1 HUGE_BUFFER 80 IN FILE
2 HUGE_BUFFER_POOLS 4 IN FILE
3 BUFFER 1110 IN FILE
4 BUFFER_POOLS 19 IN FILE
5 BUFFER_MODE 0 IN FILE
6 BUFFER_FAST_RELEASE 1 SYS
7 MAX_BUFFER 1110 IN FILE
DM的参数类型(para_type):
- Sys/session:动态参数,同时修改内存和配置文件
- Readonly:在数据库运行时,不能修改
- Infile:静态参数,修改配置文件,重启实例服务生效。
-
字典缓冲区
存放数据字典信息,如模式、表、列、触发器等信息。实例会将部分的数据字典信息加载到字典缓冲区中,并采用lru算法进行字典信息的控制
相关视图:
v$dict_cache_item:字典缓冲区中的字典对象的信息
v$dict_cache:字典缓冲区的信息
-
SQL缓冲区
用于存储包信息(package),执行计划,结果集缓冲的一片专用缓存。对于sql类型多,pkg比较多,复杂的系统建议将该参数调大。
- A语法分析(字典缓冲区,sql缓冲区)
- B语义分析(字典缓冲区)
- C权限分析(字典缓冲区)
- D查找数据块是否存在内存,不在内存(产生物理读),在内存(数据缓冲区,sql缓冲区)。
- E是否有可用的执行计划,如果有,按执行计划来,如果没有,就生成执行计划,运行sql,将结果集返回客户端。(字典缓冲区,sql缓冲区,排序区,hash区)。
清空某个sql执行计划:
- SP_clear_plan_cache:清空执行缓存信息。
定义: SP_clear_plan_cache(plan_id bigint)
Plan_id指定计划ID,其值可以从动态视图v$cacheplan中的cache_item列获得。
- SP_set_pln_rs_cache:强制设置指定计划结果集缓存的生效及失效。
定义: SP_set_pln_rs_cache(plan_id bigint,to_cache int)
Plan_id指定计划ID,其值可以从动态视图v$cacheplan中的cache_item列获得。
To_cache:指定缓存与否 0:不缓存,1:缓存。定义:
- 重做日志缓冲区
用于存重做日志的内存缓冲区,为了避免直接对磁盘IO进行随机写,将数据转换为顺序写,提高数据写性能。
RLOG_BUF_SIZE: 重做日志缓冲区大小,单位:page 大小设置为2的幂。
RLOG_POOL_SIZE: 最大日志缓冲区的大小,单位:M.
-
排序区
排序区是提供数据排序所需要的内存空间,如果内存无法完成,把部分的排序转到磁盘上,对外排序。
Sort_buf_size
-
hash区
服务器中有hash相关的操作,需要用到hash缓冲区。
HJ_BUF_GLOBAL_SIZE:全局hashjoin最大的内存空间。
HJ_BUF_SIZE:单次hashjoin操作最大内存空间
HAGR_BUF_SIZE:单位hash分组操作最大的内存空间
-
其他运行时的内存池
Vm pool
Sess pool
rt_heap
注意:
- 字典缓冲区,数据缓冲区,日志缓冲区,sql缓冲区都不是共享内存池的一部分,都是相互独立的。
- 数据缓冲区不会拓展