技术原理
核心机制
- 会话级计划缓存控制
GaussDB接收到SQL语句后,首次执行该SQL时,对其进行词语法解析、查询重写等操作后生成执行计划,并在会话中对执行计划进行缓存并计算其占用的内存大小,并将生成执行计划必要的上下文信息进行保存,用于该执行计划触发淘汰机制后的重建操作。具体流程如图1所示。
会话级的计划缓存管控通过一个LRU链表,根据执行计划的执行频次进行优先展示的逻辑实现。当对执行计划进行缓存完成后,会将计划指针记录在LRU链表头部,每次使用过的执行计划缓存会移动到链表头部,即越靠近LRU链表头部的执行计划,即为最近使用频次越高的的执行计划。
在新建计划时,会检查当前会话内计划缓存总大小是否超过设定阈值,如果超过,则从LRU链表尾部开始遍历计划并释放,直到会话级计划缓存总大小小于设定阈值。
下次重复执行时,会尝试获取计划缓存。如果计划缓存已存在,则将计划指针移动到LRU链表头,继续正常执行;否则需要重新创建计划,新建计划流程和首次生成计划一致。
- 全局共享级计划缓存GPC控制
全局共享级计划缓存GPC管控,是在会话级计划缓存管控基础上实现的。由于全局共享级计划同一时间下可能被多个会话同时使用,无法直接淘汰并清理出可用的内存,即GPC仅在没有会话使用时才能触发淘汰。具体流程如图2所示。
为保证全局共享级计划缓存实时生效,如果全局共享级计划缓存内存不足且无法淘汰时,则计划无法存入全局共享,进行会话级计划缓存管控控制。会话级计划缓存被串行使用,在本会话内可保证需要清理时直接删除。
检查当前计划存入GPC后是否会导致GPC总内存大小超限,如果未超限,则正常存入GPC;否则,开始遍历LRU链表并尝试淘汰。如果淘汰成功,该计划存入GPC;如果淘汰失败,计划仅存入当前会话,无法存入GPC。
计划缓存淘汰后重建会导致词语法解析等流程的再执行,会带来额外的性能开销。
接口介绍
- GUC参数说明
表1 计划缓存管控功能GUC参数说明 管控等级
参数名
参数说明
会话级
max_plancache_memory_ratio
用于管控会话级计划缓存,具体信息请参见《参考》中“数据库运行参数说明 > GUC参数说明 > 负载管理”章节中关于max_plancache_memory_ratio的描述。
全局共享级
global_plancache_memory_ratio
用于管控全局共享级计划缓存,具体信息请参见《参考》中“数据库运行参数说明 > GUC参数说明 > 负载管理”章节中关于global_plancache_memory_ratio的描述。
- 视图中涉及列说明
表2 计划缓存管控功能相关视图说明 视图名
涉及列说明
GS_ALL_PREPARED_STATEMENTS
size:表示该PREPARE语句的计划占用内存大小,单位为Byte。
is_deleted:表示该计划是否被淘汰。
DBE_PERF.GS_PLANCACHE_STAT
size:表示该PREPARE语句的计划占用内存大小,单位为Byte。
is_deleted:表示该计划是否被淘汰。
DBE_PERF.GLOBAL_PLANCACHE_STATUS
size:表示该GPC计划占用内存大小,单位为Byte。
DBE_PERF.LOCAL_PLANCACHE_STATUS
size:表示该GPC计划占用内存大小,单位为Byte。

