
# 技术原理
#### 核心机制
- 会话级计划缓存控制 GaussDB接收到SQL语句后，首次执行该SQL时，对其进行词语法解析、查询重写等操作后生成执行计划，并在会话中对执行计划进行缓存并计算其占用的内存大小，并将生成执行计划必要的上下文信息进行保存，用于该执行计划触发淘汰机制后的重建操作。具体流程如[图1]所示。
  图1会话级计划缓存控制流程   
  ![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/figure/zh-cn_image_0000002590200786.png "点击放大")
  会话级的计划缓存管控通过一个LRU链表，根据执行计划的执行频次进行优先展示的逻辑实现。当对执行计划进行缓存完成后，会将计划指针记录在LRU链表头部，每次使用过的执行计划缓存会移动到链表头部，即越靠近LRU链表头部的执行计划，即为最近使用频次越高的的执行计划。
  在新建计划时，会检查当前会话内计划缓存总大小是否超过设定阈值，如果超过，则从LRU链表尾部开始遍历计划并释放，直到会话级计划缓存总大小小于设定阈值。
  下次重复执行时，会尝试获取计划缓存。如果计划缓存已存在，则将计划指针移动到LRU链表头，继续正常执行；否则需要重新创建计划，新建计划流程和首次生成计划一致。
  

- 全局共享级计划缓存GPC控制 全局共享级计划缓存GPC管控，是在会话级计划缓存管控基础上实现的。由于全局共享级计划同一时间下可能被多个会话同时使用，无法直接淘汰并清理出可用的内存，即GPC仅在没有会话使用时才能触发淘汰。具体流程如[图2]所示。
  图2全局共享级计划缓存控制流程   
  ![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/figure/zh-cn_image_0000002620720291.png "点击放大")
  为保证全局共享级计划缓存实时生效，如果全局共享级计划缓存内存不足且无法淘汰时，则计划无法存入全局共享，进行会话级计划缓存管控控制。会话级计划缓存被串行使用，在本会话内可保证需要清理时直接删除。
  检查当前计划存入GPC后是否会导致GPC总内存大小超限，如果未超限，则正常存入GPC；否则，开始遍历LRU链表并尝试淘汰。如果淘汰成功，该计划存入GPC；如果淘汰失败，计划仅存入当前会话，无法存入GPC。
  ![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  计划缓存淘汰后重建会导致词语法解析等流程的再执行，会带来额外的性能开销。
  
 
#### 接口介绍
- 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。                                                                               |
     
  
 
