达梦体系结构:内存架构
- 内存架构
- 数据缓冲区
- 重做日志缓冲区
- SQL缓冲区
- 字典缓冲区
- 共享内存池
- 运行时的内存池
达梦数据库由数据库和实例构成:
- 数据库是指磁盘上存放的数据库文件的集合,包括参数文件、控制文件、数据文件、日志文件等。
- 实例是指一组运行的数据库进程/线程以及一块大型的共享内存。
内存架构
数据缓冲区
数据缓冲区即Buffer Pool,用于缓存从数据文件中读取到内存的数据页。BUFFER包含NORMAL、FAST、RECYCLE、KEEP四种类型,其大小分别由INI配置文件中的BUFFER、FAST_POOL_PAGES、RECYCLE和KEEP四个静态文件参数控制。不同类型的缓冲区的淘汰机制不同。
数据缓冲区采用LRU算法淘汰机制。数据缓冲区的大小直接影响数据库的读写性能,OLTP数据缓冲区建议占服务器物理内存的40%到60%,OLAP数据缓冲区可以更大一些。
检查数据缓冲区信息:
select * from v$bufferpool;select * from v$parameter t where name in ('BUFFER','FAST_POOL_PAGES','RECYCLE','KEEP');
修改数据缓冲区大小为1024M:
alter system set 'BUFFER'=1024 spfile;
重做日志缓冲区
重做日志缓冲区将随机的磁盘写转化为日志顺序写。其大小由INI静态文件参数 RLOG_BUF_SIZE 控制。
select * from v$parameter t where name='RLOG_BUF_SIZE';alter system set 'RLOG_BUF_SIZE'=512 spfile;
重做日志刷盘在以下四种情况下会被触发:
- 执行COMMIT语句;
- 每3秒自动触发一次;
- 日志缓冲区满;
- 执行CHECKPOINT检查点。
因此,在批量INSERT操作中,减少commit次数可以显著提高数据插入效率。
SQL缓冲区
SQL缓冲区用于缓存执行过的SQL语句、执行计划、缓存结果集(默认不开启)。SQL Cache Pool的大小由静态文件参数 CACHE_POOL_SIZE 控制。
select * from v$parameter t where name='CACHE_POOL_SIZE';alter system set 'CACHE_POOL_SIZE'=200 spfile;
参数 USE_PLN_POOL 用于控制是否启用执行计划重用。默认为1,表示启用。
参数 RS_CAN_CACHE 用于控制是否启用结果集缓存。默认为0,表示不启用。
select * from v$parameter t where name in ('USE_PLN_POOL', 'RS_CAN_CACHE');
与SQL缓冲区相关的数据字典:
--查询缓存项(需要开启USE_PLN_POOL)
select * from v$cacheitem;--查询缓存的SQL文本
select * from v$cachesql;--查询缓存的执行计划(需要开启USE_PLN_POOL)
select * from v$cachepln;--查询缓存的结果集(需要开启USE_PLN_POOL)
select * from v$cachers;
绑定和清理执行计划:
--绑定执行计划
call SP_SET_PLN_BINDED(sql_text, schema_id, plan_type, 2);--清理执行计划
call SP_CLEAR_PLAN_CACHE(plan_id);
更多请参考:https://eco.dameng.com/document-preview/dm/zh-cn/pm/sql-appendix
字典缓冲区
字典缓冲区缓存了数据字典等系统表的数据,其大小由静态文件参数 DICT_POOL_SIZE 控制。
select * from v$parameter t where name='DICT_BUF_SIZE';
与字典缓冲区相关的视图:
select * from v$dynamic_tables where name like '%DICT%';select * from v$DICT_CACHE_ITEM;select * from V$DICT_CACHE;
共享内存池
共享内存池即主内存池(Memory Pool)。当其他内存池(比如运行时内存池)空间不够时,会向主内存池申请空间。
共享内存池是服务器启动时从操作系统中申请的一大片内存,很多需要内存分配的地方都是从主内存池分配。如果需要的内存大于配置值,共享内存池也可以进行自动扩展。
静态文件参数 MEMORY_EXTENT_SIZE 指定了共享内存池每次扩展的大小,系统级动态参数 MEMORY_TARGET 指定了共享内存池能扩展到的最大大小。
select * from v$parameter t where name like 'MEMORY%';
-- MEMORY_EXTENT_SIZE:每次扩展的大小
-- MEMORY_TARGET:目标大小
-- MEMORY_N_POOLS:共享内存池的个数,默认1个,高并发时可设置多个
-- MAX_OS_MEMORY:内存占用OS内存的比例,默认100,建议调到80%-90%
共享内存池相关视图:
select * from v$mem_pool;
运行时的内存池
运行时的内存池的特点是使用时申请,用完即释放。这部分包含虚拟内存池(vm pool)、会话池(session pool)、排序区、哈希区等。
排序区的大小由会话级动态参数 SORT_BUF_SIZE控制。少量的数据排序优先在内存中的排序区进行。排序数据量较大内存中放不下时,会占用临时表空间进行排序。
select * from v$parameter t where name like 'SORT_%';
哈希区的大小由会话级动态参数 HJ_BUF_SIZE控制。哈希连接、HASH分区操作会占用哈希区内存。
select * from v$parameter t where name like 'HJ_%';
排序区和哈希区都属于虚拟缓冲区,实施使用时会申请虚拟内存池或会话池的内存空间。两者大小由以下四个参数确定:
VM_POOL_SIZE
:静态文件参数,系统虚拟内存池大小,单位为KB。直接从操作系统中申请,有效值范围32~1024*1024
。VM_POOL_TARGET
:静态文件参数,虚拟内存池能扩展到的最大大小,单位为KB。有效值范围0~10*1024*1024
,0表示不限制。SESS_POOL_SIZE
:系统级动态参数,会话缓冲区大小,单位为KB。有效值范围16~1024*1024
。如果申请的内存超过实际能申请的上限,则按16KB大小重新申请。SESS_POOL_TARGET
:系统级动态参数,会话缓冲区能扩充的最大大小,单位为KB。有效值范围0~10*1024*1024
,0表示不限制。
select * from v$parameter t where name like 'VM_POOL_%';select * from v$parameter t where name like 'SESS_POOL_%';