#内存体系

YashanDB数据库包含多个内存区域,每个内存区域包含多个子组件。

  • 共享内存区域(SGA,Shared Global Area)

    共享内存区域是一组所有后台线程以及会话能够共享访问的内存结构,例如数据缓存、SQL缓存、数据字典缓存等。

  • 私有内存区域(SPA,Session Private Area)

    私有内存区域是会话独占和管理的内存区域,例如会话栈内存、会话堆内存。

# 共享内存区域(SGA,Shared Global Area)

共享内存区域一般共享给多个会话或线程使用,主要包括内存共享池(SHARE POOL)、数据缓存(DATA BUFFER)、有界加速缓存(AC BUFFER)以及虚拟内存(VIRTUAL MEMORY)。

  • 内存共享池(SHARE POOL):内存共享池缓存多种类型的信息,例如SQL解析树、执行计划和数据字典缓存等。

  • 数据缓存(DATA BUFFER):数据缓存用于对数据的访问加速,当访问的数据块在缓存未命中时,需要先从磁盘读取到该缓存,当缓存占用太高时,会淘汰一些不经常使用的数据块。

  • 有界加速缓存(AC BUFFER):有界加速缓类似数据缓存,但缓存的对象不同,只缓存AC对象。

  • 虚拟内存(VIRTUAL MEMORY):即Materialize zone,虚拟内存主要为需要物化数据的SQL算子使用。

# 内存共享池(SHARE POOL)

内存共享池包含多个内存区域,各区域描述如下:

  • SQL缓存:保存SQL解析树和执行计划,SQL引擎在执行语句时,首先会匹配SQL缓存,如果存在相同语句则无需编译直接使用已编译的执行计划,从而避免硬解析,节省开销。

  • 日志缓存:redo日志的缓存区,日志并发写入缓存区,批量刷盘,从而减少磁盘IO和降低响应时延。

  • PL池:存储过程、包、触发器等对象创建后会加载到PL池,以提高后续再次执行的效率。

  • 数据字典缓存:数据字典包括数据库文件、表、索引、列、用户、权限和其它数据库对象的有关信息。在SQL解析和执行时,SQL引擎查看数据字典,核对和验证对象信息。数据字典是极为频繁使用的信息,缓存后极大提升访问效率。

  • 大对象池:分配大对象的区域,例如超大SQL文本。

  • 全局缓存资源池:存放共享集群的数据块的全局资源元数据信息。

  • 全局锁资源池:存放共享集群的全局锁相关的元数据信息。

  • 全局队列资源池:存放共享集群的全局缓存和锁的排队管理信息。

# 数据缓存(DATA BUFFER)

数据缓存用于缓存当前或最近使用的从磁盘读取的数据块的拷贝,来优化数据库的I/O减少物理读/写。采用LRU算法管理,当缓存区域内存不足,需要回收内存以重用时,选择一些最长时间未使用的缓存块进行淘汰回收。

数据缓存分为行数据缓存和列数据缓存。其中行数据缓存存放的是行表相关的数据块拷贝,而列数据缓存存放的是列表相关的数据块拷贝。

# 有界加速缓存(AC BUFFER)

有界加速缓类似数据缓存,但缓存的对象不同,只缓存基于有界理论的AC对象。

# 虚拟内存(VM,VIRTUAL MEMORY)

虚拟内存主要为需要物化数据的SQL算子使用,且在物化对象过大时将磁盘作为虚拟内存使用。虚拟内存又分为虚拟内存和列虚拟内存。其中行虚拟内存是需要物化数据的SQL算子计算行存表数据时使用,列虚拟内存是需要物化数据的SQL算子计算列存表数据时使用。

# 私有内存区域(SPA,Session Private Area)

私有内存区域是每个会话创建时分配的独占内存区域,与共享内存区域不同,此区域的内存由会话独占和管理,会话退出时释放,该内存区域主要是满足SQL执行时的各种内存空间需求。该区域主要包括两部分:

  • 会话栈内存:该区域一般用来存放会话执行过程中临时使用的局部变量等。

  • 会话堆内存:该区域一般用来存放生命周期较长的运行期数据。