注册
达梦内存简介
专栏/培训园地/ 文章详情 /

达梦内存简介

Da A Joey 2024/05/11 776 0 0
摘要

使用的内存可以分为三部分,缓冲区、内存池、其他内存区。

缓冲区

数据缓冲区:

从磁盘中读取的数据页在内存中的镜像,dm.ini中的BUFFER、FAST_POOL、RECYCLE、KEEP等,普通数据页使用LRU算法淘汰。每条SQL语句请求的数据,都是从数据缓冲区中取得的,若不存在,才会从磁盘中读取数据并加载到缓冲区中。

日志缓冲区:

日志缓冲区对应ini参数中的RLOG_BUF_SIZE,数据库日志将对磁盘的随机写转换成顺序写。

字典缓冲区:

字典缓冲区是保存数据库对象的一片缓冲区,对应INI参数DICT_CACHE_SIZE, DM7里面数据对象其实对应的是系统表上的一些信息,内存中的数据对象是通过将系统表上的信息取出并解析出来得到的,该缓冲区一是避免了频繁向磁盘请求获取系统表信息,二是可以减少系统表信息解析开销,在数据对象较多(比如存在非常多分区很多的表)时建议放大。
LRU算法进行淘汰,可以通过视图v$db_cache查看。

SQL缓冲区

SQL_CACHE_POOL,简称SCP,对应INI参数CACHE_POOL_SIZE,是用来存储包信息(PACKAGE)、执行计划、结果集缓存的一片专用缓存区域,对于SQL类别比较多,或者PKG比较多、复杂的系统,建议将该参数调大。

内存池

服务器启动时从操作系统申请的一大片内存,后续服务器运行过程中,一般情况下,很多需要内存分配的地方都是从该池分配,如果需要的内存大于配置值(MEM_POOL),该池也会自动扩展,一般情况下不收缩,最大扩展到MAX_OS_MEMORY大小。

其他运行内存池

服务器运行过程中,内存的使用有两种模式,一种是直接从内存池申请需要的内存大小,另外一种方式是从操作系统申请一大片内存来做成自己模块的内存池来使用(VM_POOL、SESS_POOL 、RT_HEAP等等),这样可以减少频繁从数据库主内存池申请内存的开销,一般来说一个会话可以理解为一个单独的运行环境,有自己的私有内存池(HASH SORT 等操作都时从自己的私有池上申请内存),部分少量的从主池申请,另外还有部分线程或者子系统也拥有自己独立的内存池,如CKPT刷盘线程有CKPT_POOL,序列管理有NSEQ_POOL 内存池。
所以在实际硬件配置中,尽量使用大内存来存放所有的数据页,以减少从磁盘中读取数据的开销,内存的速度比磁盘快的多的多。

排序相关

SORT_FLAG

排序机制,比较常用的是0/1取值。
0代表老排序机制,按照排序缓冲区SORT_BUF_SIZE大小获取数据,并进行排序,即每次排序的父线程都会直接申请sort_buf_size大小的内存供作排序使用。
1代表新排序机制,大内存排序方式,将大内存排序缓冲区SORT_BUF_GLOBAL_SIZE按照内存片大小SORT_BLK_SIZE进行分片,并对每个内存片进行排序,再对整个大内存排序缓冲区的数据进行排序,每次排序操作发起时获取的内存大小可以理解为sort_blk_size的大小,不够的时候再从SORT_BUF_GLOBAL_SIZE中获取更多的sort_blk_size大小的内存片,直到其大小超出SORT_BUF_GLOBAL_SIZE后报错。
一般建议OLAP型业务配置为0,排序最大内存不受SORT_BUF_GLOBAL_SIZE限制,否则可能会在内存仍有剩余的情况下报错“内存不足”。OLTP型业务配置为1,减少内存浪费。

SORT_BUF_GLOBAL_SIZE

该参数含义:新排序机制下,排序全局内存使用上限。

SORT_BUF_SIZE

原排序机制下,排序缓存区最大值

SORT_BLK_SIZE

新排序机制下对数据进行排序的排序缓冲区分片大小

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服