#内存体系
YashanDB数据库包含多个内存区域,每个内存区域包含多个子组件。
共享内存区域(SGA,Shared Global Area)
共享内存区域是一组所有后台线程以及会话能够共享访问的内存结构,例如数据缓存、日志缓存、内存共享池等。
私有内存区域(SPA,Session Private Area)
私有内存区域是会话独占和管理的内存区域,例如会话栈内存。
# 共享内存区域
共享内存区域一般共享给多个会话或线程使用,主要包括内存共享池、数据缓存、日志缓存等。
# 内存共享池
# 功能简介
内存共享池是数据库中用于缓存共享数据和元信息的核心区域,通过缓存频繁访问的数据,可显著减少磁盘I/O和重复解析开销,提升SQL执行效率。缓存的内容主要包括:
SQL解析树
执行计划
数据字典缓存
共享游标
会话共享内存结构(例如锁、事务信息等)
内存共享池由以下内存区域构成:
| 内存区 | 功能 |
|---|---|
| SQL缓存(SQL Buffer) | SQL执行过程中的内存缓存区,根据功能可划分为SQL主内存池和PL内存池,系统根据一定比例分配PL内存池后,剩余内存全为SQL主内存池。 * SQL主内存池(SQL Main Pool):用于缓存SQL解析树和执行计划,SQL引擎在执行语句时,首先会匹配SQL缓存,如果存在相同语句则无需编译直接使用已编译的执行计划,从而避免硬解析,节省开销。 * PL内存池(PL Pool):存储过程、包、触发器等对象创建后会加载到PL池,以提高后续再次执行的效率。 |
| 数据字典缓存(DICTIONARY CACHE POOL) | 用于缓存数据字典,数据字典包括表、索引、列、用户、权限和其它数据库对象的有关元数据信息。在SQL解析和执行时,SQL引擎查看数据字典,核对和验证对象信息。数据字典是极为频繁使用的信息,通过缓存可极大地提升访问效率。 |
| 锁资源池(Lock Pool) | 用于缓存全局锁资源,支持多会话并发访问时的锁管理与资源协调。 |
| 游标缓存池(Cursor Pool) | 用于缓存SQL执行过程中生成的游标资源,支持重复执行相同SQL时的快速复用。 |
| 故障恢复缓冲池(Recovery Buddy Pool) | 用于缓存恢复过程中的临时数据,协助实例在崩溃后快速读取和处理redo日志,加速恢复过程。 |
| 全局锁资源本地缓存池(GLS Pool) | 仅共享集群/分布式集群中存在,用于本地缓存全局锁资源的元数据信息,提升锁管理效率。 |
| 全局缓存资源池(Block Resource Pool) | 仅共享集群/分布式集群中存在,用于缓存数据块的全局资源元数据信息,支持跨节点数据一致性管理。 |
| 全局锁资源池(Non-Block Resource Pool) | 仅共享集群/分布式集群中存在,用于缓存全局锁相关的元数据信息。 |
| 全局缓存资源锁池(GCS Lock Pool) | 仅共享集群/分布式集群中存在,用于缓存数据块在当前实例可读写锁级别信息。 |
| 全局历史快照资源池(GCS PC Pool) | 仅共享集群/分布式集群中存在,用于缓存全局缓存的历史快照元数据信息。 |
| 全局队列资源池(GRC REQ Pool) | 仅共享集群/分布式集群中存在,用于缓存全局缓存和锁的排队管理信息。 |
| 全局对象亲和规则资源池(GRC Object Pool) | 仅共享集群/分布式集群中存在,用于缓存全局对象亲和规则元数据信息。 |
| 逻辑日志解析资源池(Stream Pool) | 用于缓存YStream解析时的元数据、逻辑变更记录(LCR,Logical Change Record)缓存、收发队列等信息。 |
| 分布式内存池(DSTB Pool) | 仅存算一体分布式集群中存在,用于缓存分布式集群管理、元数据管理等分布式模块的管理信息。 |
| 冗余内存(Free Pool) | 作为内存共享池的冗余内存资源,可动态分配给其他内存池,以应对负载波动或资源需求变化,提升内存资源利用率。 |
# 配置与管理
容量配置:内存共享池的总容量通过SHARE_POOL_SIZE参数配置。
性能影响:容量过小会导致频繁解析,过大可能造成内存浪费。
调优方向:对于高并发、SQL重用率高的系统,建议适当增大该池容量。
# 数据缓存
# 功能简介
数据缓存用于缓存当前或最近使用的从磁盘读取的数据块的拷贝,分为行数据缓存和列数据缓存,行数据缓存用于缓存行存表的数据块拷贝、列存表的元数据管理和热数据的数据块拷贝,列数据缓存用于缓存列存表冷数据的数据块拷贝。
当用户或会话访问某数据块时:
若该块已在缓存中(又称“缓存命中”),直接从内存读取,无需访问磁盘。
当缓存未命中,则从磁盘读取数据块并加载至缓存。
采用LRU算法管理,当缓存区域内存不足、需要回收内存以重用时,系统根据使用频率淘汰最久未使用的数据块。
# 配置与管理
容量配置:
行数据缓存的容量通过DATA_BUFFER_SIZE参数配置。
列数据缓存的容量由COLUMNAR_BUFFER_SIZE参数和COLUMNAR_DATA_BUFFER_PERCENT参数共同决定,计算公式为
COLUMNAR_BUFFER_SIZE * (100 - COLUMNAR_DATA_BUFFER_PERCENT) / 100。
性能影响:该缓存区的容量会直接影响数据库性能,容量过小会导致频繁磁盘I/O,过大可能造成内存浪费。
调优方向:根据数据量和访问模式合理设置该缓存区大小。
# 日志缓存
# 功能简介
日志缓存用于缓存数据库事务产生的重做日志(Redo Log),在事务提交前,日志先写入此缓存区,再由redo刷盘线程(LOGW)定期或redo数量达到阈值时批量将缓存写入磁盘,从而减少磁盘I/O次数,提升写入性能。
# 配置与管理
容量配置:日志缓存的容量通过REDO_BUFFER_SIZE参数配置。
性能影响:日志缓存大小影响事务写入延迟和恢复性能。
调优方向:在高写入负载场景中,适当增大该缓存区容量可降低日志写入延迟。
# 临时缓存
# 功能简介
临时缓存是虚拟内存的纯内存部分,主要用于索引构建的排序、TEMP_LOB缓存以及单行执行算子物化区缓冲。
当该缓存区内存不足时,系统会将部分数据换出到SWAP表空间(即使用磁盘空间拓展内存),提供超过临时缓存大小的容量空间。
# 配置与管理
容量配置:临时缓存的容量通过VM_BUFFER_SIZE参数配置。
性能影响:换入换出频繁会降低性能。
调优方向:在索引构建、大数据处理场景中,适当增大该缓存区容量,可减少换入换出频率,提升性能。同时,还可以与SWAP表空间协同调优,例如增加文件数量、允许文件大小自动扩展等。
# 数据脏块刷新缓存
# 功能简介
数据脏块刷新缓存是数据脏块刷新线程(DBWR)用于临时存储脏数据块(即已修改但尚未写入磁盘的数据块)的内存区域。DBWR线程会定期或在特定条件下将缓存区的脏数据块写入磁盘,确保数据持久化。
# 配置与管理
容量配置:数据脏块刷新缓存的内存容量由DBWR_BUFFER_SIZE参数和DBWR_COUNT参数共同决定,计算公式为
DBWR_BUFFER_SIZE * DBWR_COUNT。性能影响:增大该池可减少磁盘I/O,但占用内存较多。
调优方向:在高并发写入场景中,适当增大该池容量可提升写入性能。
# 热页缓存
# 功能简介
热页缓存用于缓存数据库频繁读访问的页面,通过预加载热点数据,减少磁盘I/O,降低响应延迟,提升查询性能。
系统会自动识别热点页,在查询执行前将可能访问的数据页预加载至缓存。
# 配置与管理
由系统自行从共享内存区域总容量中分配与回收热页缓存的内存。
# 大对象池
# 功能简介
大对象池用于分配和缓存超过一个页面大小的大对象,例如超大SQL文本、JSON数据、XML数据、LOB数据等,避免频繁在共享池中分配/释放小内存块。
# 配置与管理
容量配置:大对象池的容量通过LARGE_POOL_SIZE参数配置。
性能影响:适用于大对象频繁操作的场景,例如批量导入、JSON处理等。
调优方向:在大对象操作频繁的场景中,建议配置合理大小,避免内存不足或浪费。
# 任务内存池
# 功能简介
任务内存池用于支持数据库定时任务(JOB)的创建、调度和执行,包括:
JOB的执行上下文分配
任务调度器的内存管理
任务执行堆的分配与回收
每个JOB使用独立内存上下文,内存释放后才可被其他JOB复用。当缓存区域内存不足时,淘汰长时间未执行的任务上下文。
# 配置与管理
由系统自行从共享内存区域总容量中分配与回收务内存池的内存。
# 审计全局缓存
# 功能简介
审计全局缓存用于缓存异步审计日志,启用异步审计日志写入时数据库会先将审计日志缓存于此,待满足条件(例如队列满、定时刷新)时批量写入系统表或外部文件。
# 配置与管理
容量配置:审计全局缓存的容量通过AUDIT_QUEUE_SIZE参数配置。
性能影响:影响审计日志写入延迟和磁盘I/O。
调优方向:在高审计负载场景中,建议适当增大该池容量,避免频繁刷新。
# 全局应用池
# 功能简介
全局应用池是SQL引擎执行过程使用的全局内存池,主要用于执行堆对象的生成。
当会话私有的应用池不足时,SQL执行期间可动态从该池申请内存,执行完成后自动释放。
# 配置与管理
容量配置:全局应用池的容量通过WORK_AREA_POOL_SIZE参数配置。
性能影响:全局应用池不足可能导致会话频繁申请内存失败,影响执行成功率。
调优方向:根据并发会话数和执行负载合理配置。
# 私有内存区域
私有内存区域是每个会话创建时分配的独占内存区域,与共享内存区域不同,此区域的内存由会话独占和管理,会话退出时释放,该内存区域主要是满足SQL执行时的各种内存空间需求。该区域主要包括:
列执行虚拟内存(Columnar VM Buffer)
栈内存(Stack Memory)
堆内存(Heap Memory)
# 列执行虚拟内存
# 功能简介
列执行虚拟内存用于物化缓存SQL引擎执行阶段的对象,SQL算子计算列存表数据时使用。
当该缓存区内存不足时,系统会将部分数据换出到SWAP表空间(即使用磁盘空间拓展内存),提供超过列执行虚拟内存大小的容量空间。
# 配置与管理
容量配置:
列执行虚拟内存的容量由COLUMNAR_VM_BUFFER_SIZE参数配置。
允许使用的SWAP表空间容量通过COLUMNAR_VM_SWAP_SIZE参数配置。
性能影响:缓存不足时,换入换出频繁会降低性能。
调优方向:根据列存表大小和查询负载,适当增大COLUMNAR_VM_BUFFER_SIZE。根据系统内存和SWAP空间,合理配置COLUMNAR_VM_SWAP_SIZE。
# 栈内存
# 功能简介
栈内存分为会话栈内存和系统栈内存:
会话栈内存:用于缓存会话过程中产生的临时对象。
系统栈内存:用于缓存函数调用信息、临时变量信息等。
# 配置与管理
容量配置:会话栈内存的容量由WORK_AREA_STACK_SIZE参数配置,如需调整系统栈内存的容量则需联系我们的技术支持。
性能影响:
会话栈内存不足可能导致临时对象创建失败或内存溢出。
系统栈内存不足可能导致函数调用栈溢出。
调优方向:根据会话并发数和执行复杂度合理配置。
# 堆内存
# 功能简介
堆内存是会话的执行态内存池,用于在SQL执行过程中动态分配和释放临时对象,例如中间结果、临时表等。
当SQL执行期间独占内存不足时,会话还可以动态从内存扩展池的全局应用池中申请内存,执行完成后自动释放。
# 配置与管理
容量配置:堆内存的容量通过WORK_AREA_HEAP_SIZE参数配置。
性能影响:堆内存不足可能导致临时对象创建失败,影响执行效率。
调优方向:根据SQL执行复杂度和并发会话数合理配置WORK_AREA_HEAP_SIZE,并与全局应用池协同调优,避免频繁跨池申请内存。

