内存结构
内存结构主要包含内存池、缓冲区、排序区、哈希区等。
内存池
内存池包括共享内存池和其他一些运行时内存池。
共享内存池
DM Server在启动时从操作系统申请的一大片内存,称之为共享内存池。
查看共享池使用状态
动态视图 V$MEM_POOL
详细记录了当前系统中所有的内存池的状态。
select * from v$mem_pool;
共享内存池相关参数
grep 'MEMORY' dm.ini
主要关注2个参数:MEMORY_POOL 和 MEMORY_TARGET
- MEMORY_POOL :共享内存池初始大小,以M为单位,默认为200M。数据库系统运行过程中所需内存大于此参数值时,会自动扩展。有效值范围:64~67108864。
- MEMORY_EXTENT_SIZE:指定共享内存池每次扩展的大小
- MEMORY_TARGET :共享内存池可扩充最大值,当超过该值后,空闲时会收缩到的大小。以M为单位,有效值范围:0~67108864,0表示不限制
查看参数配置
select * from v$dm_ini where para_name in( 'MEMORY_POOL', 'MEMORY_EXTENT_SIZE', 'MEMORY_TARGET');
-- 获取配置文件中参数值
SELECT SF_GET_PARA_VALUE(1, 'MEMORY_POOL');
修改共享内存大小
-- 重启生效,MEMORY_POOL 是静态参数
sp_set_para_value(2,'MEMORY_POOL',350);
运行时内存池
除了共享内存池外,DM Server中的功能模块,在运行过程中向操作系统申请一片内存作为该功能模块的内存池使用。如:会话内存池、虚拟机内存池等
缓冲区
分类
- 数据缓冲区
- 日志缓冲区
- 字典缓冲区
- SQL缓冲区
数据缓冲区
数据缓冲区是将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的区域。
DM Server启动时,根据配置数据缓冲区大小(BUFFER)向操作系统申请一片连续内存并将其按数据页大小进行格式化,并置入"自由"链中。
数据缓冲区存在三条链来管理被缓冲的数据页:
- “自由”链:用于存放目前尚未使用的内存数据页,
- “LRU”链:用于存放已被使用的内存数据页(包括未修改和已修改),
- “脏”链:用于存放已被修改过的内存数据页。
类型
数据缓冲区有四种类型,分别是:NORMAL、KEEP、FAST和RECYCLE
配置参数
- BUFFER:指定NORMAL缓冲区大小,默认缓冲区为NORMAL。
- KEEP:设置KEEP缓冲区大小,将部分热数据固定缓存在内存中。只能在表空间级别上配置
- RECYCLE:设置RECYCLE缓冲区大小,给临时表空间使用
- FAST_POOL_PAGES:设置FAST缓冲区数据页总数,FAST_POOL_PAGES 的值最多不能超过BUFFER 总页数的一半
读多页
默认情况,每次I/O操作只读取一页。对于需要进行大量I/O操作的业务场景,将会严重影响系统性能。在此类场景中,可以通过指定MULTI_PAGE_GET_NUM参数(默认值为1页)来控制每次读取的页数。必须衡量业务需求的情形之后在调整此参数
参数配置调整
查看参数的值
SELECT sp_set_para_value(1,'BUFFER');
调整BUFFER值
-- 静态参数, 需要重启生效
sp_set_para_value(2,'BUFFER',300);
推荐配置
- BUFFER:系统缓冲区大小为可用物理内存的 60%~80%
- BUFFER_POOLS:BUFFER 的分区数量,将一个大池分成多个大小相同的小池子。每个 BUFFER 分区的大小为 BUFFER/BUFFER_POOLS
日志缓冲区
用于存放重做日志的内存缓冲区。为了避免由于直接的磁盘IO而使系统性能受到影响,在运行过程中产生的日志并不会立即被写入磁盘,而是先将其放置到日志缓冲区中。
可以指定RLOG_BUF_SIZE参数来控制日志缓冲区大小,日志缓冲区所占用的内存是从共享内存池中申请的,单位为页数量,且大小必须为2的N次方,否则采用系统默认大小512页
相关参数
select para_name,para_value from v$dm_ini where para_name like 'RLOG%';
- Rlog_buf_size: 日志缓冲区的大小,单位 page
- RLOG_POOL_SIZE:最大日志缓冲区的大小 (M)。
- 内存小于16G:建议设置为256M
- 内存大于16G,小于64G:建议设置为1024M
- 当内存大于64G:建议设置为2048M。
字典缓冲区
存储一些数据字典信息,如模式信息、表信息、列信息、触发器信息等。
配置参数
通过DICT_BUF_SIZE参数设置字典缓冲区的大小,默认值为5M。建议改成50M以上
SQL缓冲区
SQL缓冲区为了提供在执行SQL语句过程中所需要的内存,包括计划、SQL语句和结果集缓存。
配置参数
通过CACHE_POOL_SIZE参数控制SQL缓冲区大小。通常情况下,在内存小于16G,建议设置为200M;内存大于16G,小于64G,建议设置为1024M;当内存大于64G时,建议设置为2048M。
排序区
提供数据排序操作所需要的内存空间。当内存不足以完成排序操作所需的量时,便会使用磁盘排序(即,TEMP表空间)
配置参数
- SORT_BUF_SIZE:指定排序缓冲区的大小。
- 在内存小于64G时建议设置为10M,大于64G时建议设置为512M
- SORT_FLAG:指定排序机制,0:原排序机制;1:新排序机制。
- 在内存大于64G时建议使用新排序机制,其他情况使用原排序机制。
- SORT_BUF_GLOBAL_SIZE:当内存小于16G时,建议设置为500M,大于16G小于64G时建议设置为2000,当内存大于64G时,建议设置为5120M
- SORT_BLK_SIZE:默认为 1M,新排序机制下,每个排序分片空间的大小,必须小于 SORT_BUF_GLOBAL_SIZE。
哈希区
为哈希连接而设定的缓冲区。
参数配置
- HJ_BUF_SIZE:用来控制哈希连接的缓冲区大小。该值的大小可能会限制哈希连接的效率。
- HJ_BUF_GLOBAL_SIZE :HASH 连接操作符的数据总缓存大小(>=HJ_BUF_SIZE),默认为500 M。
- HAGR_BUF_GLOBAL_SIZE: HAGR、DIST、集合操作、SPL2、NTTS2 以及HTAB 操作符的数据总缓存大小(>= HAGR_BUF_SIZE),默认为500 M。
- HAGR_BUF_SIZE: 单个 HAGR、DIST、集合操作、SPL2、NTTS2以及 HTAB 操作符的数据总缓存大小,默认值50M。
推荐值
-
在服务器物理内存小于16GB的情况下,建议使用默认值。
-
当物理内存大于16GB,小于64GB时,建议将HJ_BUF_SIZE 和 HAGR_BUF_SIZE 设置为500M。HAGR_BUF_GLOBAL_SIZE 和 HJ_BUF_GLOBAL_SIZE 设置为10000M以上。
-
当物理内存大于64GB时,建议将HJ_BUF_SIZE 和 HAGR_BUF_SIZE 设置为1000M。HAGR_BUF_GLOBAL_SIZE 和 HJ_BUF_GLOBAL_SIZE 设置为15000M以上。
数据库内存相关参数
参数名 | 缺省值 | 属性 | 说明 |
---|---|---|---|
MAX_OS_MEMORY | 100 | 静态 | DM服务器能使用的最大内存占操作系统物理内存与虚拟内存总和的百分比,有效值范围(40~100)。当取值100时,服务器不进行内存的检查 注:对于32位版本的DM服务器,虚拟内存最大为2G |
MEMORY_POOL | 200 | 静态 | 共享内存池大小,以M为单位。共享内存池是由DM管理的内存。有效值范围:32位平台为(642000),64位平台为(6467108864) |
MEMORY_N_POOLS | 1 | 静态 | 共享内存池个数,有效值范围(0~2048),0与1等价,即共享池不分片。分片时,每池的初始容量为MEMORY_POOL / MEMORY_N_POOLS, 但受最小初始容量为30M限制,因此实际分片数可能会小于MEMORY_N_POOLS,每个池的TARGET也按此方式由MEMORY_TARGET导出 |
MEMORY_TARGET | 0 | 动态,系统级 | 共享内存池在扩充到此大小以上后,空闲时收缩回此指定大小,以M为单位,有效值范围:32位平台为(02000),64位平台为(067108864),0表示不限制 |
MEMORY_EXTENT_SIZE | 1 | 静态 | 共享内存池每次扩充的大小,以M为单位,有效值范围(1~10240) |
MEMORY_LEAK_CHECK | 0 | 动态,系统级 | 是否开启内存泄漏检测。0:否;1:是,此时系统对每一次内存分配都登记到动态视图V$MEM_REGINFO中, 并在释放时解除登记 |
MEMORY_MAGIC_CHECK | 2 | 静态 | 是否开启对所有内存池的校验。0:不开启;1:开启校验,校验码基于分配出的块地址计算,在被分配空间的头部和尾部写入校验码;2:增强校验,在1的基础上,如果是内存池分配的,则对尾部未使用空间也计算校验码,写入未使用空间的头部 |
HUGEPAGE_THRESHOLD | 32 | 动态,系统级 | 如果从OS申请内存的尺寸大于等于 HUGEPAGE_THRESHOLD * 2M, 则尝试先申请巨页内存,若失败再申请常规内存; 0表示不尝试使用巨页内存。有效值范围(0~1024)。注:本参数仅对LINUX操作系统有效,使用巨页内存需要对OS进行相关配置 |
MEMORY_BAK_POOL | 4 | 静态 | 系统备份内存池大小,以M为单位。系统备份内存池是由DM管理的内存。有效值范围(2~10000) |
HUGE_MEMORY_PERCENTAGE | 50 | 静态 | 指示HUGE_BUFFER中可以借用作常规内存分配的空间百分比,有效值为0~100。 |
HUGE_BUFFER | 80 | 静态 | HUGE表使用的缓冲区大小,以M为单位。有效值范围(80~1048576) |
HUGE_BUFFER_POOLS | 4 | 静态 | HUGE BUFFER系统分区数,每个HUGE BUFFER分区的大小为HUGE_BUFFER/HUGE_BUFFER_POOLS。有效值范围(1~512) |
BUFFER | 100 | 静态 | 系统缓冲区大小,以M为单位。推荐值:系统缓冲区大小为可用物理内存的60%~80%。有效值范围(8~1048576) |
BUFFER_POOLS | 19 | 静态 | BUFFER系统分区数,每个BUFFER分区的大小为BUFFER/BUFFER_POOLS。有效值范围(1~512) |
FAST_POOL_PAGES | 3000 | 静态 | 快速缓冲区页数。有效值范围(0~99999999)。 FAST_POOL_PAGES的值最多不能超过BUFFER总页数的一半,如果超过,系统会自动调整为BUFFER总页数的一半 |
FAST_ROLL_PAGES | 1000 | 静态 | BUFFER中FAST POOL回滚页数量。有效值范围(0~9999999),最多不超过FAST_POOL_PAGES的75%,如果超过,系统会自动调整。填充规则:将回滚表空间0号文件的0~FAST_ROLL_PAGE-1号页填入FAST POOL中 |
KEEP | 8 | 静态 | KEEP缓冲区大小,以M为单位。有效值范围(8~1048576) |
RECYCLE | 64 | 静态 | RECYCLE缓冲区大小,以M为单位。有效值范围(8~1048576) |
RECYCLE_POOLS | 19 | 静态 | RECYCLE缓冲区分区数,每个RECYCLE分区的大小为RECYCLE/RECYCLE_POOLS。有效值范围(1~512) |
MULTI_PAGE_GET_NUM | 1 | 动态,系统级 | 缓冲区最多一次读取的页面数。有效值范围(1~64) 注:当数据库加密时不支持多页读取,此时DM.INI中此参数值无效 |
PRELOAD_SCAN_NUM | 0 | 动态,系统级 | 数据页首次预加载时连续扫描的页数,有效值范围(0~64)。取值为0时关闭数据页预加载功能 注:PRELOAD_SCAN_NUM实际有效范围为(0 ~ EXTENT_SIZE – 2),当大于EXTENT - 2时将会间接失效预加载 |
PRELOAD_EXTENT_NUM | 0 | 动态,系统级 | 数据页首次预加载的簇数量,有效值范围(0~64)。取值为0时关闭数据页预加载功能 |
SORT_FLAG | 0 | 动态,会话级 | 排序机制,0:原排序机制;1:新排序机制 |
SORT_BUF_SIZE | 2 | 动态,会话级 | 原排序机制下,排序缓存区最大值,以M为单位。有效值范围(1~2048) |
SORT_BUF_GLOBAL_SIZE | 1000 | 动态,系统级 | 新排序机制下,排序全局内存使用上限,以M为单位。有效值范围(10~4294967294) |
SORT_BLK_SIZE | 1 | 动态,会话级 | 新排序机制下,每个排序分片空间的大小,以M为单位,必须小于SORT_BUF_GLOBAL_SIZE。有效值范围(1~50) |
HAGR_HASH_SIZE | 100000 | 动态,会话级 | HAGR操作时,建立HASH表的桶个数。有效值范围(10000~100000000) |
MAL_LEAK_CHECK | 0 | 动态,系统级 | 是否打开MAL内存泄露检查。0:关闭;1:打开 MAL_LEAK_CHECK为1时,可查询V$MAL_USING_LETTERS检查MAL内存泄露。 |
HJ_BUF_GLOBAL_SIZE | 500 | 动态,系统级 | HASH 连接操作符的数据总缓存大小(>= HJ_BUF_SIZE),系统级参数,以M为单位。有效值范围(10~500000) |
HJ_BUF_SIZE | 50 | 动态,会话级 | 单个HASH连接操作符的数据总缓存大小,以M为单位,必须小于HJ_BUF_GLOBAL_SIZE。有效值范围(2~100000) |
HJ_BLK_SIZE | 1 | 动态,会话级 | HASH连接操作符每次分配缓存(BLK)大小,以M为单位,必须小于HJ_BUF_SIZE。有效值范围(1~50) |
HAGR_BUF_GLOBAL_SIZE | 500 | 动态,系统级 | HAGR、DIST、集合操作、SPL2、NTTS2以及HTAB操作符的数据总缓存大小(>= HAGR_BUF_SIZE),系统级参数,以M为单位。有效值范围(10~1000000) |
HAGR_BUF_SIZE | 50 | 动态,会话级 | 单个HAGR、DIST、集合操作、SPL2、NTTS2以及HTAB操作符的数据总缓存大小,以M为单位。有效值范围(2~500000)。 如果HAGR_BUF_SIZE设置的值满足范围且大于HAGR_BUF_GLOBAL_SIZE,那么会在HAGR_BUF_GLOBAL_SIZE/2和500000两个值中,选出较小的那个,作为新的HAGR_BUF_SIZE值。 |
HAGR_BLK_SIZE | 1 | 动态,会话级 | HAGR、DIST、集合操作、SPL2、NTTS2以及HTAB操作符每次分配缓存(BLK)大小,以M为单位,必须小于HAGR_BUF_SIZE。有效值范围(1~50) |
MTAB_MEM_SIZE | 8 | 静态 | MTAB缓存BDTA占用内存空间的大小,以KB为单位,有效值范围(1~1048576) |
FTAB_MEM_SIZE | 0 | 静态 | FTAB缓存BDTA占用内存空间的大小,以KB为单位。取值范围为(0~64 * 1024)。0表示使用MTAB,大于0时才使用FTAB。当取值小于32时,FTAB_MEM_SIZE均使用32 |
MMT_SIZE | 0 | 动态,会话级 | 是否使用MMT。0:不启用;其他有效值:启用,并确定单个映射文件大小,必须小于MMT_GLOBAL_SIZE。有效值范围(0~64),单位MB |
MMT_GLOBAL_SIZE | 4000 | 动态,系统级 | 系统总共使用MMT的文件总大小,单位MB,有效值范围(10~1000000),仅在MMT_SIZE大于0时有效 |
MMT_FLAG | 1 | 动态,会话级 | MMT存储数据方式。1:按页存储;2:BDTA存储。仅在MMT_SIZE大于0时有效 |
DICT_BUF_SIZE | 5 | 静态 | 字典缓冲区大小,以M为单位,有效值范围(1~2048)。单位:MB |
HFS_CACHE_SIZE | 160 | 动态,系统级 | HUGE表 I/U/D 时HDTA_BUFFER缓存池大小,单位为MB。有效值范围(160~ 2000) |
VM_STACK_SIZE | 256 | 静态 | 系统执行时虚拟机堆栈大小,单位为K,堆栈的空间是从操作系统中申请的,有效值范围(64~256*1024) |
VM_POOL_SIZE | 64 | 静态 | 系统执行时虚拟机内存池大小,在执行过程中用到的内存大部分是从这里申请的,它的空间是从操作系统中直接申请的,有效值范围(32~1024*1024) |
VM_POOL_TARGET | 32768 | 静态 | 虚拟机内存池能扩充到的最大大小,以KB为单位,有效值范围(0~1010241024),0表示不限制 |
SESS_POOL_SIZE | 64 | 动态,系统级 | 会话缓冲区大小,以KB为单位,有效值范围(16~1024*1024)。若所申请的内存超过实际能申请的大小,则系统将按16KB大小重新申请 |
SESS_POOL_TARGET | 32768 | 动态,系统级 | 会话缓冲区能扩充到的最大大小,以KB为单位,有效值范围(0~1010241024),0表示不限制 |
RT_HEAP_TARGET | 8192 | 动态,系统级 | 会话上用于动态对象存储的RT_HEAP最大可扩展到的大小,以K为单位,有效值范围(8192~1010241024) |
VM_MEM_HEAP | 0 | 动态,系统级 | VM是否使用HEAP分配内存。0:MEMORY POOL模式;1:HEAP模式;2:MEMORY POOL和HEAP混合模式 |
RFIL_RECV_BUF_SIZE | 16 | 静态 | 控制服务器启动时,进行REDO操作过程中,REDO日志文件恢复时BUFFER的大小,以MB为单位,有效值范围(16~4000) |
COLDATA_POOL_SIZE | 0 | 动态,系统级 | COLDATA池的大小,以M为单位 |
HAGR_DISTINCT_HASH_TABLE_SIZE | 10000 | 动态,会话级 | 分组DISTINCT操作中HASH表的大小(桶数)。取值范围为(10000~100000000) |
CNNTB_HASH_TABLE_SIZE | 100 | 动态,会话级 | 指定CNNTB操作符中创建HASH表的大小。有效值范围(100~100000000) |
GLOBAL_RTREE_BUF_SIZE | 100 | 动态,会话级 | R树全局缓冲区大小,以MB为单位 |
SINGLE_RTREE_BUF_SIZE | 10 | 动态,会话级 | 单个R树的缓冲区大小,以MB为单位,必须小于GLOBAL_RTREE_BUF_SIZE |
SORT_OPT_SIZE | 1 | 静态 | 整型/浮点型数据排序优化辅助空间大小,对应待排序数组的最大最小差值,单位M,有效值范围(0~1024)。取值1M时对应待排序数组的最大最小差值为262144,超过则不能使用优化。 |
TSORT_OPT | 1 | 动态,系统级 | 排序优化选项。0:排序操作一律使用估算的行数分配内存(至少2M);1:打开优化,排序操作结果行数较少时,使用实际的记录行数分配内存 |
内存的使用情况
查询内存池BUFFERPOOL的页数、读取页数和命中率信息
SELECT NAME,N_PAGES,N_LOGIC_READS,RAT_HIT FROM V$BUFFERPOOL;