达梦内存结构学习

达梦内存结构学习,全部参照官方文档。

  1. 数据库管理系统是一种对内存申请和释放操作频率很高的软件,若每次对内存的使用都通过操作系统函数来申请和释放,效率低,所以DM数据库加入了自己的内存管理。
  2. DM数据库管理系统的内存结构主要包括内存池、缓冲区和其它内存区(哈希区、排序区等)。根据系统中子模块的不同功能,对内存进行了上述划分,并采用了不同的管理模式。
  3. DM server的内存池包括共享内存池和其它一些运行时内存池。可通过查询动态视图V$MEM_POOL获取当前系统中所有内存池的状态与使用情况。
  4. 共享内存池是DM server在启动时从操作系统申请的一大片内存。在DM server运行过程中,经常会申请、释放小片内存,直接向操作系统申请、释放内存需要发出系统调用,可能会引起线程切换,降低系统效率。采用共享内存池可一次向操作系统申请一片较大的内存,即为共享内存池。当系统在运行过程中需要申请内存时,可在共享内存池中进行申请,用完后再归还给共享内存池。可通过ini参数MEMORY_POOL配置共享内存池的初始大小,若在运行过程中,所需内存大于配置值,也可进行自动扩展,每次扩展大小由MEMORY_EXTENT_SIZE指定,扩充上限由MEMORY_TARGET指定。
  5. 除了共享内存池,DM server的一些功能模块在运行时还会使用自己的运行时内存池。这些运行时内存池是从操作系统申请的一片内存作为本功能模块的内存池来使用,如会话内存池(SESS_POOL)、虚拟机内存池(VM_POOL)、RT_HEAP等,这样可以减少频繁向数据库主内存池(共享池)申请内存的开销,一般来说一个会话可以理解为一个单独的运行环境,有自己的私有内存池(HASH SORT等操作都是从自己的私有内存池上申请),部分少量的从主池申请,另外还有部分线程或子系统也拥有自己独立的内存池,如CKPT刷盘线程有CKPT_POOL,序列管理有NSEQ_POOL内存池。
  6. 缓冲区又分为:数据缓冲区、日志缓冲区、字典缓冲区、SQL缓冲区。
  7. 数据缓冲区是DM server在将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的地方。这时DM server至关重要的内存区域之一,将其设定的太小,会导致缓冲页命中率低,磁盘IO频繁;将其设置的太大,又会导致操作系统内存本身不够用。系统启动时,首先根据配置的数据缓冲区大小向操作系统申请一片连续的内存区并将其按数据页大小进行格式化,并置入自由链中。数据缓冲区存在三条链来管理被缓冲的数据页,一条是自由链,由于存放目前尚未使用的内存数据页,一条是LRU链,用于存放已经被使用的内存数据页(包括已修改和未修改),还有一条脏链,用于存放已经被修改过的内存数据页。
  8. 在系统运行过程中,通常存在一部分“非常热”(反复被访问)的数据页,将他们一直留在缓冲区中,对系统性能有好处。对于这部分数据页,数据缓冲区开辟了一个特定的区域用于存放他们,以保证这些页不参与一般的淘汰机制,可以一直留在数据缓冲区中。
  9. DM server中有四种类型的数据缓冲区,分别是:NORMAL、KEEP、FAST、RECYCLE。用户可以在创建表空间时,指定表空间属于NORMAL或KEEP缓冲区。RECYCLE缓冲区供临时表空间使用,FAST缓冲区根据用户指定的FAST_POOL_PAGES大小由系统自动进行管理,用户不能指定使用FAST和RECYCLE缓冲区的表或表空间。
  10. NORMAL缓冲区主要是提供给系统处理的一些数据页,没有特定指定缓冲区的情况下,默认缓冲区为NORMAL;KEEP的特性是对缓冲区中的数据页很少或几乎不怎么淘汰出去。
  11. DM server提供了可以更改这些缓冲区大小的参数:BUFFER(NORMAL缓冲区大小,最大扩展到MAX_BUFFER大小,dm8中取消了MAX_BUFFER)、KEEP(KEEP缓冲区大小)、RECYCLE(RECYCLE缓冲区大小)、FAST_POOL_PAGES(FAST缓冲区总页数)。
  12. DM server提供了可以读取多页的参数MULTI_PAGE_GET_NUM,可以通过调整该参数提高命中率。
  13. 日志缓冲区是用于存放重做日志的内存缓冲区。为了避免由于直接的磁盘io而使系统性能受到影响,系统在运行过程中产生的日志并不会立即被写入磁盘,而是和数据页一样,先将其放到日志缓冲区中。由于重做日志的格式与数据页完全不同,且重做日志具有连续写的特点,并且逻辑上,写重做日志比写数据页IO优先级更高,所以将数据缓冲区与重做日志缓冲区区分开来。
  14. DM server提供了参数RLOG_BUF_SIZE对(单个)日志缓冲区大小进行控制,日志缓冲区所占用的内存是从共享内存池中申请的,单位为页数量,且大小必须为2的N次方,否则采用系统默认大小512页。
  15. 字典缓冲区主要存储一些数据字典信息,如模式信息、表信息、列信息、触发器信息等。每次对数据库的操作都会涉及到数据字典信息,访问数据字典信息的效率直接影响到相应的操作效率。可用ini参数DICT_BUF_SIZE控制(M为单位),若实际应用中涉及对分区数较多的水平分区表的访问,可适当调大该值。
  16. sql缓冲区提供在执行sql语句过程中所需要的内存,包括包信息、计划、sql语句和结果集缓存。INI参数USE_PLN_POOL用来指定是否需要计划重用,取值非0则启动计划重用,为0则禁止计划重用。INI参数CACHE_POOL_SIZE用于设置sql缓冲区大小。对于SQL类别较多,或package较多、复杂的系统,可调大该参数。
  17. 结果集缓存包括sql查询结果集缓存和DMSQL程序函数结果集缓存,在ini参数RS_CAN_CACHE=1且USE_PLN_POOL非0时服务器才会缓存结果集(结果集重用是基于计划重用的,若查询的计划不能缓存,则其查询结果集必然不能缓存)。
  18. RS_CAN_CACHE控制结果集重用,当置为0时表示手动模式(MANUAL),在此模式下默认不缓存查询结果集,但可以通过语句提示等方法指示系统对必要的查询结果集进行缓存;置为1表示强制模式(FORCE),默认缓存所有可缓存结果集,也可以通过新增配置参数(可通过设置RS_CACHE_TABLES和RS_CACHE_MIN_TIME对缓存的结果集进行限制和过滤)以及语句提示等方法取消某些不合适的结果集缓存。
  19. DBA可以在sql语句中设置“RESULT_CACHE”或“NO_RESULT_CACHE”HINT手动指示查询的结果集是否缓存。如:SELECT /*+ RESULT_CACHE*/ ID,NAME FROM SYSOBJECTS; SELECT /*+ NO_RESULT_CACHE*/ ID,NAME FROM SYSOBJECTS; 在语句中使用hint的优先级高于ini参数中的设置。还可以使用系统过程SP_SET_PLN_RS_CACHE来强制设置指定结果集缓存的生效与失效。这个系统过程对结果集缓存的指定高于其它所有结果集缓存的设置。
  20. 客户端结果集也可以设置缓存,但需要在配置文件dm_svc.conf中设置参数: ENABLE_RS_CACHE=(1) //表示启用缓存;RS_CACHE_SIZE=(100) //表示缓存区的大小为100M; //RS_REFRESH_FREQ=(30) //表示每30秒检查缓存的有效性,若失效,自动重查,0表示不检查。
  21. INI参数CLT_CACHE_TABLES也可控制哪些表的结果集可以在客户端缓存。另外,FIRST_ROWS参数表示当查询的结果达到该行数时,就返回结果集,不再继续查询,除非用户向服务器发一个FETCH命令。这个参数也用于客户端缓存的配置,仅当结果集的行数不超过FIRST_ROWS时,该结果集才能被客户端缓存。
  22. 排序缓冲区提供数据排序所需要的内存空间。sql运行过程中,若存在排序、分区、去重等操作,会用到排序内存区。在每次排序过程中,都首先申请内存(从哪申请?操作系统?共享内存池?SESS_POOL?),排序结束后再释放内存。DM server提供了SORT_BUF_SIZE参数来配置排序缓冲区的大小。
  23. 排序分为内排序和外排序两种,内排序指所有的排序可以在内存中完成,外排序指的是需要排序的数据不能完全放入内存,这是需要将部分内存中的数据刷到磁盘上,最终再进行归并完成整个排序。对于内排序,仅受参数SORT_BUF_SIZE影响,但是需要注意的是,每个会话在执行SORT时都会根据SORT_BUF_SIZE申请内存,此参数不宜配置过大。对于外排序其具体大小受SORT_BUF_SIZE影响,内存放不下的部分根据配置有三种处理方式:MTAB(普通临时表)、FTAB(临时文件表)、MMT(内存映射表)。
  24. DM8的ini参数中关于排序区的参数有如下几个:SORT_FLAG(排序机制,0表示原排序机制;1表示新排序机制)、SORT_BUF_SIZE(原排序机制下,排序缓存区最大值,M为单位)、SORT_BUF_GLOBAL_SIZE(新排序机制下,排序全局内存使用上限,以M为单位)、SORT_BLK_SIZE(新排序机制下,每个排序分片空间的大小,以M为单位)。(我的理解是若采用原排序机制,每个会话sql插叙需要用到排序区就申请SORT_BUF_SIZE大小的内存区;若采用新排序机制,则所有会话共用一整块排序区,不过是有分片的,分片大小由SORT_BLK_SIZE决定,上限由SORT_BUF_GLOBAL_SIZE决定。不晓得对不对哦)
  25. DM8提供了为哈希连接而设定的缓冲区,不过该缓冲区是个虚拟缓冲区,系统并没有真正创建特定属于哈希缓冲区的内存,而是在进行哈希连接时,对排序的数量进行了计算,若计算出的数据量大小超过了哈希缓冲区的大小,则使用dm8创新的外存哈希方式,若没有超过哈希缓冲区的大小,实际上使用的还是VPOOL内存池来进行哈希操作。
  26. HASH相关的操作主要有HASH JOIN、HASH GROUP BY,相关的ini参数主要有:HJ_BUF_GLOBAL_SIZE(全局HASH JOIN最大内存空间)、HJ_BUF_SIZE(单次HASH JOIN操作最大内存空间)、HASH_BLK_SIZE(单次HASH JOIN操作中每次申请的内存空间)、HAGR_BUF_GLOBAL_SIZE(全局HASH分组最大内存空间)、HAGR_BUF_SIZE(单次HASH分组最大内存空间)、HAGR_BLK_SIZE(单次HASH分组操作每次申请的内存空间)、HAGR_HASH_SIZE(HASH分组操作HASH表创建时的桶数,这个参数不太懂,啥桶数?)、JOIN_HASH_SIZE(HASH JOIN等操作初始化时HASH表的桶数,这个也不懂。)
  27. 一个HASH JOIN准备执行时,首先根据左表创建JOIN_HASH_SIZE桶数的HASH表,后续每次需要分配内存时,分配HJ_BLK_SIZE大小的内存,直至HJ_BUF_SIZE,之后放不下的部分类似SORT操作,以各种方式缓存在磁盘/内存中,再等待后续操作进行合并。HAGR和HASH JOIN类似。值得注意的是,JOIN_HASH_SIZE、HAGR_HASH_SIZE两个操作,初始化HASH表桶数越多,查询时的HASH冲突就越少,但是太大的桶数可能使HASH初始化操作缓慢(存在内存清零操作)。
  28. 固态硬盘采用闪存作为存储介质,因为没有机械磁头的寻道时间,在读写效率上比机械磁盘具有优势。在内存、SSD、机械磁盘之间,符合存储分级的条件。为提高系统运行效率,DM server将SSD文件作为内存缓存与普通磁盘之间的缓冲层,称为“ssd缓存”,由ini参数SSD_BUF_SIZE和SSD_FILE_PATH来配置SSD缓冲,其中SSD_BUF_SIZE指定缓冲区的大小,单位为M,SSD_FILE_PATH指定该文件所在的文件夹路径,管理员需要保证设置的路径是位于固态磁盘上。默认SSD缓冲区是关闭的,即SSD_BUF_SIZE为0,若要配置缓冲区,将其设置为大于0并指定SSD_FILE_PATH即可。
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值