注册
达梦数据库内存结构总结
专栏/培训园地/ 文章详情 /

达梦数据库内存结构总结

纯手工老虎 2024/05/17 1006 0 0
摘要

引言

在数据库管理系统(DBMS)中,内存管理是一个核心的组件,它直接影响到数据库的性能和稳定性,一个优秀的内存结构设计,应当能够兼顾数据库的稳定运行及高效运作。达梦数据库(DM)通过其内存结构的设计,优化了内存的使用效率,增强了对内存使用的监控和管理。本文将对达梦数据库的内存结构进行学习总结,并结合个人思考,探讨其与其他数据库内存管理的异同。

达梦数据库内存结构概述

达梦数据库的内存结构主要包括内存池、缓冲区、排序区和哈希区等关键部分。

内存池

内存池是达梦数据库中用于申请和释放内存的区域,它通过减少对操作系统内存申请和释放的系统调用,提高了内存操作的效率。内存池分为共享内存池和运行时内存池,

共享内存池

共享内存池在系统启动时分配,但并非固定值,也会随着程序的运行发生改变。内存池相关参数的配置应当是比较重要的,过大可能会导致数据库实例启动时,获取不到足够的内存资源,导致启动失败。可以通过设置 MEMORY_POOL参数,根据实际环境中的内存资源情况调整共享内存池大小,但这并非是一个硬上限,在实际运行过程中,我们无法确定程序到底需要多少内存,因此共享内存池还存在拓展机制,当需要时能够拓展内存池。同时还引入MEMORY_TARGET参数,作为内存池拓展的高水位。因此,在实际工作中,应该需要合适的配置MEMORY_POOL+MEMORY_TARGET+MEMORY_EXTENT_SIZE三个参数,确保内存池大小在一个合理的范围内,提高程序使用内存的效率和防止oom,并减少频繁拓展收缩带来的额外性能开支。

运行时内存池

运行时内存池主要是供dmserver的其余模块使用,因为并非在启动时分配,而是随着程序的运行过程,由模块自行向系统申请,因此称为运行时内存池,手册中对运行时内存池并未过多介绍,应当是由各模块自行维护。

缓冲区

缓冲区是达梦数据库中用于临时存储数据的区域,它包括数据缓冲区、日志缓冲区、字典缓冲区和SQL缓冲区。数据缓冲区通过LRU算法管理数据页,以提高缓冲页命中率,减少磁盘I/O。字典缓冲区和SQL缓冲区则分别用于存储数据字典信息和SQL语句及其执行计划,以提高查询效率。另外,在部分文档中,可以读到ssd缓冲区的相关内容,但查询最新版的官方文档已经无相关信息,猜测是已经废弃该特性,因此不提及。

数据缓冲区

数据缓冲区是 DM Server 在将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的地方。这是 DM Server 至关重要的内存区域之一,将其设定得太小,会导致缓冲页命中率低,磁盘 IO 频繁;将其设定得太大,又会导致操作系统内存本身不够用。数据缓冲区在我个人理解看来,基本原理和mysql的innodb_buffer_pool相当接近,同样是作为被访问数据页的缓存区域,能够解决数据频繁被范访问时需要多次读取磁盘带来的额外io开销问题,也同样使用lru链表管理数据页。

同时,dm8也为数据缓冲区引入了四种缓冲区类型的划分,分别是 NORMAL、KEEP、FAST 和 RECYCLE。其中后两种由系统自行维护,主要供用户配置的为normal和keep类型数据缓冲区,NORMAL即为默认类型,而KEEP 的特性是对缓冲区中的数据页很少或几乎不怎么淘汰出去,引入keep类型给用户提供了针对性配置在缓冲区中常驻保留热数据页的选项。另外还引入了一次可以从磁盘中读取多个数据页进入缓存的读多页机制,在预先知道用户需求单次获取较多数据的情况下,使用读多页能够减少io的访问,提高查询效率,但该参数的配置同样需要一定的考量,盲目的设置过大,也将导致读取多余的数据页,造成io的浪费。

日志缓冲区

日志缓冲区如其名字,是用来存放redo日志的缓冲区。在运行过程中,实例需要持续不断的写入redo日志,但直接写入磁盘则会造成过多的io压力,因此也引入了日志缓冲区,同时与数据缓冲区作为区分,文档中也解释了为何不直接共用数据缓冲区。

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

字典缓冲区

字典缓冲区即是用来存放数据字典相关信息,如模式信息、表信息、列信息、触发器信息等。数据字典是sql访问数据过程中必须读取的信息,放在缓冲区中,也能够提高数据读取的效率。同样,字典缓冲区也采用LRU控制字典算法的缓存,采用按需加载的机制,做到部分加载热点数据字典,不影响效率的前提下也节省了内存资源的占用。

SQL 缓冲区

SQL缓冲区主要是保存执行计划、SQL 语句和结果集缓存,在大多数业务中,实际上执行的sql语句都是重复的,仅有参数的不同,通过缓存保存语句和执行计划,可以省略掉重新解析-生成执行计划的性能开支,

排序区

在时常程序运行过程中,sql语句对结果进行排序是必不可少的操作,而排序总是需要用到一定的内存空间甚至临时表空间。排序区为执行SQL语句中的排序操作提供内存空间,通过预先分配内存,优化了排序性能。

哈希区

哈希区是达梦数据库中用于哈希连接操作的缓冲区。它通过计算排序数据量,决定是使用内存池还是外存哈希方式进行操作。

个人思考与总结

达梦数据库的内存管理机制体现了其对性能优化的重视。特别是通过内存池的设计,减少了系统调用的开销,这一点在高并发的应用场景中尤为重要。同时,缓冲区的分类管理,如数据缓冲区的LRU链管理和字典缓冲区的按需加载,都显示了达梦数据库在内存使用上的精细化控制。

与其他数据库系统相比,如Oracle和MySQL,达梦数据库在内存管理上有着一些独特的设计。例如,Oracle的SGA(系统全局区)和PGA(程序全局区)也是用于内存管理,但它们的实现和配置方式与达梦有所不同。Oracle的SGA是共享的,用于存储共享池、数据字典缓存等,而PGA是为单个用户会话分配的非共享内存。MySQL的InnoDB存储引擎也有自己的缓冲池管理机制,用于缓存数据和索引。

达梦数据库的内存管理在某些方面更为细致,如对缓冲区的分类和参数调整提供了更多的灵活性。然而,这种灵活性也带来了配置上的复杂性,需要数据库管理员有更深入的理解和经验。此外,达梦数据库的外存哈希方式是一个创新点,它在处理大数据量时能够有效地平衡内存和磁盘的使用,这一点在其他数据库系统中不常见。

结论

达梦数据库的内存结构设计体现了其对性能和资源利用的深入考虑。通过细致的内存池管理和缓冲区分类,达梦数据库能够有效地提升数据库操作的效率,同时减少资源浪费。与其他数据库系统相比,达梦在内存管理上展现了其特色和优势,但也要求数据库管理员有更高的专业技能来充分利用这些特性。随着技术的不断进步,达梦数据库的内存管理策略有望在性能优化和资源管理上带来更多的创新和突破。
https://eco.dameng.com

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服