达梦体系结构:内存架构

发布于:2024-04-06 ⋅ 阅读:(110) ⋅ 点赞:(0)

达梦数据库由数据库实例构成:

  • 数据库是指磁盘上存放的数据库文件的集合,包括参数文件、控制文件、数据文件、日志文件等。
  • 实例是指一组运行的数据库进程/线程以及一块大型的共享内存。

内存架构

数据缓冲区

数据缓冲区即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_%';

网站公告

今日签到

点亮在社区的每一天
去签到