数据库管理系统是一种对内存申请和释放操作频率很高的软件,如果每次对内存的使用都使用操作系统函数来申请和释放,效率会比较低,加入自己的内存管理是 DBMS 系统所必须的。通常内存管理系统会带来以下好处:
- 申请、释放内存效率更高;
- 能够有效地了解内存的使用情况;
- 易于发现内存泄露和内存写越界的问题。
首先要明确的是,DM 数据库没有SGA\PGA的概念,因为 DM 数据库采用的是单进程、多线程的结构。
DM 数据库管理系统的内存结构主要包括内存池、缓冲区、排序区、哈希区等。根据系统中子模块的不同功能,对内存进行了上述划分,并采用了不同的管理模式。
从资源角度,DM 内存结构主要有 2 类对象:内存池、缓冲区。
-
内存池
- 共享内存池:
- DMDB 在运行过程中需要申请小片内存时,可在共享内存池内进行申请,当用完该内存时,再释放掉,即归还给共享内存池。
- 配置参数为 MEMORY_POOL,缺省大小为 500M。如果在运行时所需内存大于配置值,共享内存池也可进行自动扩展。
- MEMORY_EXTENT_SIZE 指定了共享内存池每次扩展的大小,默认 32M。
- MEMORY_TARGET 则指定了共享内存池扩展到超过该值后,空闲时会收缩到的大小,默认值 15000M。
- 运行时内存池:
- DM 一些功能模块在运行时从操作系统申请的一片内存,作为本功能模块的内存池来使用,如会话内存池、虚拟机内存池等。
-
缓冲区
-
数据缓冲区
- 数据缓冲区是 DM Server 在将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的地方。
- DM Server 中有四种类型的数据缓冲区,分别是 NORMAL、 KEEP、 RECYCLE 和 FAST。
- 上面四种类型的数据缓冲区对应参数及默认值为:BUFFER(1000MB)、KEEP(8MB)、RECYCLE(300MB) 和 FAST_POOL_PAGES(3000)。
- NORMAL 为没有特定指定数据缓冲区的情况下默认使用的数据缓冲区。
- KEEP 的特性是对缓冲区中的数据页很少或几乎不怎么淘汰出去。
- RECYCLE 缓冲区供临时表空间使用。
- FAST 缓冲区根据用户指定的 FAST_POOL_PAGES 大小由系统自动进行管理。
- 用户不能指定使用 RECYCLE 和 FAST 缓冲区的表或表空间。
- 用户可以在创建表空间或修改表空间时,指定表空间属于 NORMAL 或 KEEP 缓冲区。
-
日志缓冲区
- 日志缓冲区是用于存放重做日志的内存缓冲区。
- 参数 RLOG_BUF_SIZE 对日志缓冲区大小进行控制。
- 日志缓冲区所占用的内存是从共享内存池中申请的。
- 单位为页数量,且大小必须为 2 的 N 次方,否则采用系统默认大小 1024 页。
-
字典缓冲区
- 字典缓冲区主要存储一些数据字典信息,如模式信息、表信息、列信息、触发器信息等。
- 配置参数为 DICT_BUF_SIZE,默认的配置大小为 50M。
- 如果在实际应用中涉及对分区数较多的水平分区表访问,例如上千个分区,那么就需要适当调大 DICT_BUF_SIZE 参数值。
-
SQL 缓冲区
- SQL 缓冲区提供在执行 SQL 语句过程中所需要的内存,包括计划、SQL 语句和结果集缓存。
- 配置参数 CACHE_POOL_SIZE(单位为 MB),默认值为 100M。
-
排序区
- 排序缓冲区提供数据排序所需要的内存空间。
- 参数 SORT_BUF_SIZE,由于该值是由系统内部排序算法和排序数据结构决定,建议使用默认值 20M。
-
哈希区
- DM8 提供了为哈希连接而设定的缓冲区,不过该缓冲区是个虚拟缓冲区。之所以说是虚拟缓冲,是因为系统没有真正创建特定属于哈希缓冲区的内存,而是在进行哈希连接时,对排序的数据量进行了计算。如果计算出的数据量大小超过了哈希缓冲区的大小,则使用 DM8 创新的外存哈希方式;如果没有超过哈希缓冲区的大小,实际上还是使用内存池来进行哈希操作。DM Server 在 dm.ini 中提供了参数 HJ_BUF_SIZE 来进行控制,由于该值的大小可能会限制哈希连接的效率,所以建议保持默认值,或设置为更大的值。除了提供 HJ_BUF_SIZE 参数外,DM Server 还提供了创建哈希表个数的初始化参数,其中,HAGR_HASH_SIZE 表示处理聚集函数时创建哈希表的个数,建议保持默认值 100000。
DM 的管理员手册中,将排序区、哈希区单独拿出来,与内存池、缓冲区并列。但实际上,排序区、哈希区归属于运行时内存池。