在此之前我们需要知道达梦的内存构成,达梦服务器使用的内存大概分为3个部分:
数据缓冲区:服务器启动后,向操作系统申请四块大小固定的内存做为四个分区,服务器关闭前向操作系统归还内存。数据缓冲区不会拓展。
日志缓冲区:日志是数据库与磁盘间的一层缓存,将随机的磁盘写转换成顺序写,日志缓冲区是数据库和日志间的缓存,对应INI参数RLOG_BUF_SIZE,将直接的磁盘I/O转换成缓存I/O。创建时从操作系统分配内存,服务器关闭前向操作系统归还,日志缓冲区拓展时直接向操作系统申请。
SQL缓冲区:SQL CACHE POOL,简称SCP,对应INI参数CACHE_POOL_SIZE,是用来存储包信息(PACKAGE)、执行计划、结果集缓存的一片专用缓存区域,对于SQL类别比较多,或者PKG比较多、复杂的系统,建议将该参数调大。
字典缓冲区:字典缓冲区是存在数据库对象的一片缓冲区,对应INI参数DICT_BUF_SIZE,DM8里面数据对象其实对应的是系统表上的一些信息,内存中的数据对象是通过将系统表上的信息取出并解析出来得到的,该缓冲区一是避免了频繁向磁盘请求获取系统表信息,二是可以减少系统表信息解析开销,在数据对象较多(比如存在非常多分区很多的表)时建议放大。
共享内存池:服务器启动时从操作系统申请的一大片内存,后续服务器运行过程中,一般情况下,很多需要内存分配的地方都是从该池分配,下列是在dm.ini中对应的参数。
MEMORY_TARGET:指定单个共享内存池的目标大小
MEMORY_POOL:指定单个共享内存池的初始大小
MEMORY_EXTENT_SZIE:指定单个共享内存池的增量大小
MEMORY_N_POOL:可以指定多个共享内存池
备用内存池:从操作系统申请内存失败时,会从这里申请内存,在dm.ini中对应参数MEMORY_BAK_POOL。
运行时内存池:一般来说一个会话可以理解为一个单独的运行环境,有自己的私有内存池,如会话内存池,虚拟机内存池等,这部分的内存不是去跟操作系统申请而是跟共享内存池申请,在需要使用的时候被创建,使用完毕立即销毁。
排序区:SQL运行过程中,如果存在排序、分区、去重等操作,会使用到排序区内存,排序分为内排序和外排序两种,内排序指所有排序可以在内存中完成,外排序指的是需要排序的数据不能完全放入内存,这时则需要将内存中的部分数据刷到磁盘上,最终再进行归并完成整个排序。
对于内排序,仅受参数SORT_BUF_SIZE影响,但是要注意的是,每个会话在执行SORT时都会根据SORT_BUF_SIZE申请内存,此参数不宜配置过大。
对于外排序,其具体大小受SORT_BUF_SIZE影响,内存放不下的部分根据配置有三种处理方式,MTAB(普通临时表)、FTAB(临时文件表)、MMT(内存映射表三种方式)。
HASH区:
服务器中HASH相关的操作需要用到HASH相关的内存片,实际上服务器上是没有单独申请专门的内存给HASH使用,HASH操作使用的还是运行时内存池或者内存堆。
HASH相关的操作主要有HASH JOIN、HASH GROUP BY。
相关的INI参数主要有:
HJ_BUF_GLOBAL_SIZE:全局HASH JOIN最大内存空间
HJ_BUF_SIZE:单次HASH JOIN操作最大内存空间
HJ_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表的桶数
简单的了解了达梦的内存结构,接下来看看sql在达梦的执行顺序:
sql 执行的顺序:
文章
阅读量
获赞