前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【赵渝强老师】达梦数据库的内存结构

【赵渝强老师】达梦数据库的内存结构

原创
作者头像
赵渝强老师
发布于 2025-03-25 02:48:44
发布于 2025-03-25 02:48:44
840
举报
文章被收录于专栏:达梦数据库达梦数据库

数据库管理系统是一种对内存申请和释放操作频率很高的软件,如果每次对内存的使用都使用操作系统函数来申请和释放,效率会比较低,加入自己的内存管理是DBMS系统所必须的。通常内存管理系统会带来以下好处:

  • 申请、释放内存效率更高;
  • 能够有效地了解内存的使用情况;
  • 易于发现内存泄露和内存写越界的问题。

达梦数据库管理系统的内存结构主要包括内存池、缓冲区、排序区、哈希区等。根据系统中子模块的不同功能,对内存进行了上述划分,并采用了不同的管理模式。

视频讲解如下:

一、 内存池

DM Server的内存池包括共享内存池和其他一些运行时内存池。动态视图v$mem_pool详细记录了当前系统中所有的内存池的状态,可通过查询这个动态视图掌握DM Server的内存使用情况。

代码语言:sql
AI代码解释
复制
SQL> select name,sum(total_size) from v$mem_pool group by name;

# 输出的信息如下:

行号     NAME                  			 SUM(TOTAL_SIZE)     
---------- ---------------------- --------------------
1          SHARE POOL 000        	 	524288000
2          BACKUP POOL            		4194304
3          RT_MEMOBJ_VPOOL        		49283072
4          MON ITEM ARR           		134217728
5          LARGE_MEM_SQL_MONITOR  		2097152
6          DSQL BIND DATA HISTORY 	10485760
7          CYT_CACHE              		327680
8          XMAL SYS               		65536
9          XBOX SYS               		65536
10         DICT CACHE             		52428800
11         TRX                    		704512
12         INJECT HINT            		65536
13         CHECK POINT            		131072
14         HUGE AUX               		65536
15         SQL CACHE MANAGERMENT  	104857600
16         MEM FOR PIPE           		65536
17         FLASHBACK SYS          		22879992
18         DBLINK POOL          		131072
19         NSEQ CACHE           		65536
20         PARALLEL LOADER POOL 		65536
21         POLICY GRP           		2162688
22         PURG_POOL            		65536
23         DSQL STAT HISTORY    		15728640
24         DSQL ET POOL         		11534336
25         SESSION              			30736384
26         RT_HEAP              			344064
27         VIRTUAL MACHINE      		12910592

27 rows got

内存池又分为共享内存池和运行时内存池。

1.1 共享内存池

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

DM系统管理员可以通过DM Server的配置文件(dm.ini)来对共享内存池的大小进行设置,共享池的参数为MEMORY_POOL,该配置默认为500M。如果在运行时所需内存大于配置值,共享内存池也可进行自动扩展,INI参数MEMORY_EXTENT_SIZE指定了共享内存池每次扩展的大小,参数MEMORY_TARGET则指定了共享内存池扩展到超过该值后,空闲时会收缩到的大小。

代码语言:sql
AI代码解释
复制
SQL> select para_name,para_value from v$dm_ini 
    where para_name in ('MEMORY_POOL','MEMORY_TARGET','MEMORY_EXTENT_SIZE');

# 输出的信息如下:
行号     PARA_NAME          		PARA_VALUE
---------- ------------------ ----------
1          MEMORY_POOL        		500
2          MEMORY_TARGET      		15000
3          MEMORY_EXTENT_SIZE 	32

1.2 运行时内存池

除了共享内存池,DM Server的一些功能模块在运行时还会使用自己的运行时内存池。这些运行时内存池是从操作系统申请一片内存作为本功能模块的内存池来使用,如会话内存池、虚拟机内存池等。

二、 缓冲区

DM数据库中的缓冲区分为数据缓冲区、日志缓冲区、字典缓冲区和SQL缓冲区。

2.1 数据缓冲区

数据缓冲区是DM Server在将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的地方。这是DM Server至关重要的内存区域之一,将其设定得太小,会导致缓冲页命中率低,磁盘IO频繁;将其设定得太大,又会导致操作系统内存本身不够用。

代码语言:sql
AI代码解释
复制
SQL> select para_name,para_value from v$dm_ini
     where para_name in ('BUFFER','KEEP','FAST','RECYCLE');

# 输出的信息如下:
行号     		PARA_NAME PARA_VALUE
---------- --------- ----------
1          	BUFFER    	1000
2          	KEEP      	8
3          	RECYCLE   	300

# PARA_VALUE的数值为默认值分别对应 NORMAL缓冲区大小、KEEP缓冲区大小、
# RECYCLE缓冲区大小数据页总数。

DM数据库中有四种类型的数据缓冲区,分别是 NORMAL、KEEP、FAST、RECYCLE。下表说明了每种数据缓冲区的作用。

系统启动时,首先根据配置的数据缓冲区大小向操作系统申请一片连续内存并将其按数据页大小进行格式化,并置入“自由”链中。数据缓冲区存在三条链来管理被缓冲的数据页,一条是“自由”链,用于存放目前尚未使用的内存数据页,一条是“LRU”链,用于存放已被使用的内存数据页(包括未修改和已修改),还有一条即为“脏”链,用于存放已被修改过的内存数据页。

2.2 日志缓冲区

日志缓冲区是用于存放重做日志的内存缓冲区。为了避免由于直接的磁盘IO而使系统性能受到影响,系统在运行过程中产生的日志并不会立即被写入磁盘,而是和数据页一样,先将其放置到日志缓冲区中。那么为何不在数据缓冲区中缓存重做日志而要单独设立日志缓冲区呢?主要是基于以下原因:

  1. 重做日志的格式同数据页完全不一样,无法进行统一管理;
  2. 重做日志具备连续写的特点;
  3. 在逻辑上,写重做日志比数据页IO优先级更高。

DM数据库提供了参数RLOG_BUF_SIZE对日志缓冲区大小进行控制,日志缓冲区所占用的内存是从共享内存池中申请的,单位为页数量,且大小必须为2的N次方,否则采用系统默认大小1024页。

代码语言:sql
AI代码解释
复制
SQL> select para_name,para_value from v$dm_ini 
     where para_name='RLOG_BUF_SIZE';

# 输出的信息如下:

行号     		PARA_NAME     PARA_VALUE
---------- ------------- ----------
1          	RLOG_BUF_SIZE 1024

2.3 字典缓冲区

字典缓冲区主要存储一些数据字典信息,如模式信息、表信息、列信息、触发器信息等。每次对数据库的操作都会涉及到数据字典信息,访问数据字典信息的效率直接影响到相应的操作效率。DM8 采用的是将部分数据字典信息加载到缓冲区中,并采用 LRU 算法进行字典信息的控制。配置参数 DICT_BUF_SIZE 控制缓冲区的大小,默认大小为50M。缓冲区配置得太大,会浪费内存空间;配置得太小,可能会频繁地进行淘汰。

代码语言:sql
AI代码解释
复制
SQL> select para_name,para_value from v$dm_ini 
     where para_name='DICT_BUF_SIZE';

# 输出的信息如下:

行号     		PARA_NAME     PARA_VALUE
---------- ------------- ----------
1          	DICT_BUF_SIZE 50

2.4 SQL缓冲区

SQL缓冲区提供在执行SQL语句过程中所需要的内存,包括计划、SQL语句和结果集缓存。配置参数USE_PLN_POOL控制是否需要计划重用,非0时启动计划重用,为0时禁用计划重用。配置参数CACHE_POOL_SIZE设置SQL缓冲区的大小,默认值为100M。结果集缓存包括SQL查询结果集缓存和DMSQL程序函数结果集缓存,同时设置参数RS_CAN_CACHE=1且USE_PLN_POOL非0时,才会缓存结果集。

代码语言:sql
AI代码解释
复制
SQL> select para_name,para_value from v$dm_ini 
     where para_name in ('USE_PLN_POOL','CACHE_POOL_SIZE');

# 输出的信息如下:

行号     		PARA_NAME       PARA_VALUE
---------- --------------- ----------
1          	USE_PLN_POOL  		1
2          	CACHE_POOL_SIZE 	100

三、 排序区

排序缓冲区提供数据排序所需的内存空间。当用户执行SQL语句时,常常需要进行排序,所使用的内存就是排序缓冲区提供的。在每次排序过程中,都首先申请内存,排序结束后再释放内存。配置文件dm.ini中的参数SORT_BUF_SIZE用来指定排序缓冲区的大小。

代码语言:sql
AI代码解释
复制
SQL> select para_name,para_value from v$dm_ini 
     where para_name='SORT_BUF_SIZE';

# 输出的信息如下:

行号     		PARA_NAME     PARA_VALUE
---------- ------------- ----------
1          	SORT_BUF_SIZE 20

四、 哈希区

DM8 提供了为哈希连接而设定的缓冲区,不过该缓冲区是个虚拟缓冲区。之所以说是虚拟缓冲区,因为系统没有真正创建特定属于哈希缓冲区的内存,是在进行哈希连接时,对排序的数据量进行了计算。如果计算出的数据量大小超过了哈希缓冲区的大小,则使用DM8创新的外存哈希方式;如果没有超过哈希缓冲区的大小,实际上使用的还是内存池来进行哈希操作。配置文件 dm.ini 中的参数 HJ_BUF_SIZE 控制缓冲区大小,建议保留默认值,或设置更大的值。

代码语言:sql
AI代码解释
复制
SQL> select para_name,para_value from v$dm_ini 
     where para_name='HJ_BUF_SIZE';

# 输出的信息如下:

行号     		PARA_NAME   PARA_VALUE
---------- ----------- ----------
1          	HJ_BUF_SIZE 500

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【赵渝强老师】达梦数据库的归档模式
达梦数据库的备份与恢复都需要使用到重做日志文件。在默认的情况下,达梦数据库采用的非归档模式。通过执行下面的语句可以查看当前数据库实例的日志模式。
赵渝强老师
2025/03/16
800
【赵渝强老师】达梦数据库的归档模式
【赵渝强老师】达梦数据库的目录结构
达梦数据库安装成功后,通过使用Linux的tree命令可以非常方便地查看DM 8的目录结构。
赵渝强老师
2025/03/14
570
【赵渝强老师】达梦数据库的目录结构
【赵渝强老师】达梦数据库的逻辑存储结构
达梦数据库由硬盘上的文件组成,而要读写数据需要通过达梦实例来完成。那么,达梦数据库是如何存储数据的呢?要搞清楚这个问题,就需要理解什么是达梦数据库的存储结构。达梦数据库的存储结构是由逻辑存储结构和物理存储结构组成。一般来说数据库无论是关系型数据库,还是NoSQL数据库在存储结构上,都是通过逻辑存储结构来管理物理存储结构。
赵渝强老师
2025/03/24
570
【赵渝强老师】达梦数据库的逻辑存储结构
【赵渝强老师】达梦数据库的物理存储结构
达梦数据库由硬盘上的文件组成,而要读写数据需要通过达梦实例来完成。那么,达梦数据库是如何存储数据的呢?要搞清楚这个问题,就需要理解什么是达梦数据库的存储结构。达梦数据库的存储结构是由逻辑存储结构和物理存储结构组成。一般来说数据库无论是关系型数据库,还是NoSQL数据库在存储结构上,都是通过逻辑存储结构来管理物理存储结构。
赵渝强老师
2025/03/24
710
【赵渝强老师】达梦数据库的物理存储结构
【赵渝强老师】达梦数据库的线程结构
达梦数据库服务器使用“对称服务器构架”的单进程、多线程结构。这种对称服务器构架在有效地利用了系统资源的同时又提供了较高的可伸缩性能,这里所指的线程即为操作系统的线程。服务器在运行时由各种内存数据结构和一系列的线程组成,线程分为多种类型,不同类型的线程完成不同的任务。线程通过一定的同步机制对数据结构进行并发访问和处理,以完成客户提交的各种任务。执行下面的语句将查看当前达梦数据库中的线程信息。
赵渝强老师
2025/03/25
940
【赵渝强老师】达梦数据库的线程结构
MySQL底层概述—1.InnoDB内存结构
Buffer Pool是缓冲池的意思。Buffer Pool的作用是缓存表数据与索引数据,减少磁盘IO,提升效率。
东阳马生架构
2025/02/10
1600
【MySQL-23】万字总结<InnoDB引擎>——【逻辑存储结果&架构(内存结构,磁盘结构,后台线程)&事务原理&MVCC】
两次查询我们会得到如下两个ReadView (而RR可重复读级别下就只会有一个)
YY的秘密代码小屋
2024/09/09
1580
【MySQL-23】万字总结<InnoDB引擎>——【逻辑存储结果&架构(内存结构,磁盘结构,后台线程)&事务原理&MVCC】
Oracle实例和Oracle数据库(Oracle体系结构)
--==========================================
Leshami
2018/08/07
2.8K0
MySQL探秘(三):InnoDB的内存结构和特性
 常言说得好,每个成功男人背后都有一个为他默默付出的女人,而对于MySQL来说,这个“人”就是InnoDB存储引擎。  MySQL区别于其他数据库的最为重要的特点就是其插件式的表存储引擎。而在众多存储引擎中,InnoDB是最为常用的存储引擎。从MySQL5.5.8版本开始,InnoDB存储引擎是默认的存储引擎。  InnoDB存储引擎支持事务,其设计目标主要面向在线事务处理(OLTP)的应用。其特点是行锁设计、支持外键,并支持非锁定读,即默认读操作不会产生锁。  InnoDB通过使用多版本并发控制(MVCC)来获取高并发性,并且实现了SQL标准的4中隔离级别,默认为REPEATABLE级别。同时,使用一种被称为next-key-locking的策略来避免幻读现象的产生。除此之外,InnoDB存储引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead)等高性能和高可用的功能。
程序员历小冰
2018/08/27
5460
MySQL探秘(三):InnoDB的内存结构和特性
【MySQL常见疑难杂症】InnoDB存储引擎体系结构
● Buffer Pool:缓冲池是InnoDB在启动时分配的一个内存区域,用于InnoDB在访问数据时缓存表和索引数据。利用缓冲池,可以合并一些对经常访问的数据的操作,直接从内存中处理,加快了处理速度。通常,在专用数据库服务器上,可以将80%的物理内存分配给InnoDB缓冲池。为了提高缓存管理的效率,使用页面链表的方式+LRU(最近最少使用)算法进行管理。
samRsa
2025/02/21
330
【MySQL常见疑难杂症】InnoDB存储引擎体系结构
达梦数据库_达梦的数据库什么水平
达梦(DM8)数据库由实例和数据库共同组成。 实例由一组正在运行的后台进程及其所fork出的一系列线程和分配内存组成。数据库是由一系列存放在操作系统上的文件组成。 体系结构图大致为:
全栈程序员站长
2022/11/03
1K0
MySQL InnoDB 存储引擎原理浅析
本文主要基于MySQL 5.6以后版本编写,多数知识来着书籍《MySQL技术内幕++InnoDB存储引擎》,今年的多数学习知识只写在笔记里,较为零散,最近稍有时间整理出来,分享进步。
程序员小强
2021/05/27
1.5K0
InnoDB 内存结构及其原理
InnoDB 是 MySQL 的默认存储引擎,以其强大的事务支持、崩溃恢复能力和高并发处理性能著称。要深入理解 InnoDB 的内存结构及其工作原理,有必要探讨其内存使用的各个方面,包括缓冲池(Buffer Pool)、内存分配、锁结构(Lock Structure)和其他内部内存使用机制。
Michel_Rolle
2024/07/31
2.5K0
万字详解Oracle架构、原理、进程,学会世间再无复杂架构
对于一个数据库系统来说,假设这个系统没有运行,我们所能看到的和这个数据库相关的无非就是几个基于操作系统的物理文件,这是从静态的角度来看,如果从动态的角度来看呢,也就是说这个数据库系统运行起来了,能够对外提供服务了,那就意外着数据库系统启动了自己的一个实例,综合以上2个角度,Oracle如何定义上述描述呢?
JiekeXu之路
2019/06/19
3.7K1
万字详解Oracle架构、原理、进程,学会世间再无复杂架构
Linux部署达梦数据库
本文共 799 个字数,平均阅读时长 ≈ 2分钟 客户现场部署,所以没有来得及截图,后续有环境后再补充截图 一、创建安装目录 找一个风水宝地,dm用来安装数据库,dmdata用来挂载镜像 mkdir dm mkdir dmdata 然后将达梦ISO上传到dmdata 二、挂载ISO 进入dmdata文件夹下 mount dm8_20230104_HWarm_centos7_64.iso ../dmdata/ 三、安装 进入dmdata,可以看到挂载出来两个文件,执行安装 ./DMInstall.bi
小东东
2023/03/20
1.4K0
详细了解 InnoDB 内存结构及其原理
之前写过一篇文章「简单了解InnoDB原理」,现在回过头看,其实里面只是把缓冲池(Buffer Pool),重做日志缓冲(Redo Log Buffer)、插入缓冲(Insert Buffer)和自适应哈希索引(Adaptive Hash Index)等概念简单的介绍了一下。
冬夜先生
2021/10/08
6120
关系型数据库 MySQL 之 InnoDB 体系结构
InnoDB 存储引擎是 MySQL 5.5 版本后的默认存储引擎,支持事务 ACID,回滚,系统崩溃恢复能力及多版本并发控制的事务安全,主要用于 OLTP 数据库业务场景;支持自增长列(auto_increment);支持外键约束(foreign key);支持 MVCC 的行级锁;使用 Btree 索引;如果你还没有看到前面一文介绍 MySQL 体系结构,那么推荐戳此查看[MySQL 体系结构详解],介绍完 MySQL 体系结构,下面来一起学习 InnoDB 体系结构。
JiekeXu之路
2019/08/15
1.3K0
为什么MySQL内存占用这么大? for InnoDB
这是 Innodb 引擎最重要的缓存,也是提升查询性能的重要手段。一般是global共享内存中占用最大的部分。在进行 SQL 读和写的操作时,首先并不是对物理数据文件操作,而是先对 buffer_pool 进行操作,然后再通过 checkpoint 等机制写回数据文件。占用的内存启动后就不会自动释放,默认通过LRU的算法镜像缓存淘汰,每次的新数据页,都会插入buffer pool的中间,防止前面的热数据被冲掉,长时间没动静的冷数据,会被淘汰出buffer pool,但是是被其它新数据占用了,所以一般这里不会释放的,除非重启(5.7 开始支持动态调整,默认以128M的chunk单位分配内存块)。innodb_buffer_pool主要包含数据页、索引页、undo 页、insert buffer、自适应哈希索引、锁信息以及数据字典等信息。
elontian田凌翔
2019/11/11
7.8K0
为什么MySQL内存占用这么大? for InnoDB
Oracle-Oracle数据库结构
之前写了一篇文章《Oracle-知识结构漫谈》 粗略的介绍了Oracle数据库接口,在这里再更加详细的描述一下,当做是对原有知识的巩固,温故知新。
小小工匠
2021/08/16
2.1K0
【赵渝强老师】史上最详细的PostgreSQL体系架构介绍
PostgreSQL是最像Oracle的开源数据库,我们可以拿Oracle来比较学习它的体系结构,比较容易理解。PostgreSQL的主要结构如下:
赵渝强老师
2024/08/11
6800
【赵渝强老师】史上最详细的PostgreSQL体系架构介绍
推荐阅读
相关推荐
【赵渝强老师】达梦数据库的归档模式
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文