
# 技术原理
#### 核心机制
- 相同语句计划复用
  图1相同语句计划复用流程原理图   
  ![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/figure/zh-cn_image_0000002590200962.png "点击放大")
  用户SQL语句经词法解析与语法解析后，对于相同的SQL语句计划实现复用。当用户第一次执行某SQL语句时，数据库对SQL语句进行语义解析及计划生成，同时将语义解析结果及计划根据SQL等关键信息作为键（Key）构建计划缓存哈希表，进行缓存。当后续遇到相同SQL文本的SQL语句（包括所有字面值、大小写、空格等都需相同）时，根据键（Key)从计划缓存哈希表中匹配计划缓存并直接复用相同的缓存计划，从而跳过重复的解析、优化等耗时阶段。
  相较于非相同语句计划复用流程，相同语句计划复用增加了以下操作逻辑：
  - 构造计划缓存键（Key）
  
  - 使用键（Key）匹配计划
  
  - 复用计划
  
  - 存储键（Key）与执行计划相关信息
   
- 自动参数化
  图2自动参数化流程原理图   
  ![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/figure/zh-cn_image_0000002590360896.png "点击放大")
  1. 用户SQL语句经词法解析与语法解析生成原始语法树后，自动参数化模块将遍历语法树节点，对常量节点进行参数化。具体操作包括将常量节点转换为参数节点以及记录参数类型等信息。
  
  2. 根据参数化的节点信息生成SQL模板。
  
  3. 当某模板SQL首次执行时，数据库引擎基于参数化的语法树进行执行以下操作：
     - 语义分析
     
     - 计划生成
     
     - 缓存计划
      
  
  4. 当再次执行相同SQL模板语句时，启用缓存复用机制（即后续相同模板SQL复用缓存计划）。
  
  
  相较于非参数化流程，自动参数化增加了以下操作逻辑：
  - 参数化语法树
  
  - 参数化SQL文本串
  
  - 构造计划缓存key
  
  - 使用键（Key）匹配计划
  
  - 复用计划
  
  - 存储键（Key）与执行计划相关信息
  
  - 绑定参数化常量信息执行
   
 
#### 接口介绍
| GUC参数名         | GUC参数说明                                                                     |
|:---|:---|
| cursor_sharing | 控制自动参数化和相同语句计划复用功能开启。具体请参见《参考》中"数据库运行参数说明 \> GUC参数说明 \> 查询规划 \> 其他优化器选项"章节。 |
   
| Hint名                | Hint说明                                                                                                            |
|:---|:---|
| cursor_sharing_exact | 指定单个SQL语句使用相同语句计划复用，其作用等同于cursor_sharing=exact。具体请参见《SQL调优指南》中"使用Plan Hint进行调优 \> 指定cursor_sharing为exact的Hint"章节。 |
   
| 函数或视图名                                         | 函数或视图说明                                                                                                                                                                                                        |
|:---|:---|
| DBE_PERF.GS_PLANCACHE_STAT                     | 显示当前进程内全部session的可复用计划的语句信息，查看该视图需要初始用户或MONITORADMIN权限。 具体请参见《参考》中"Schema \> DBE_PERF Schema \> Query \> DBE_PERF.GS_PLANCACHE_STAT"章节。                          |
| GS_ALL_PREPARED_STATEMENTS                     | 视图新增is_reused字段表示该缓存是否被重用。 具体请参见《参考》中"系统表和系统视图 \> 系统视图 \> 其他系统视图 \> GS_ALL_PREPARED_STATEMENTS"章节。                                                               |
| DBE_PERF.GLOBAL_PLANCACHE_STATUS               | 视图新增parameterized_info字段，表示该语句通过cursor_sharing的exact或force的流程执行。 具体请参见《参考》中"Schema \> DBE_PERF Schema \> Global Plancache \> DBE_PERF.GLOBAL_PLANCACHE_STATUS"章节。 |
| DBE_PERF.GS_DIST_PLANCACHE_STAT                | 显示全部进程（包含备机）的可复用计划的信息，查看该视图需要初始用户或MONITORADMIN权限。具体请参见《参考》中"Schema \> DBE_PERF Schema \> Query \> DBE_PERF.GS_DIST_PLANCACHE_STAT"章节。                                                                          |
| pg_catalog.gs_dist_plancache_stat()            | 查看包含备机的全部进程的可复用计划的语句信息的系统函数，函数返回信息和DBE_PERF.GS_DIST_PLANCACHE_STAT一致。查看该函数需要初始用户或MONITORADMIN权限。具体请参见《参考》中"SQL参考 \> 函数和操作符 \> 统计信息函数"章节。                                                                       |
| pg_catalog.gs_plancache_stat()                 | 查看当前进程内全部session的可复用计划的语句信息，函数返回信息和DBE_PERF.GS_PLANCACHE_STAT一致。查看该函数需要初始用户或MONITORADMIN权限。 具体请参见《参考》中"SQL参考 \> 函数和操作符 \> 统计信息函数"章节。                             |
| DBE_PERF.global_plancache_status(is_with_plan) | 显示在所有节点上的全局计划缓存的状态信息，即plan_info列。入参is_with_plan为bool类型，默认值为false。当入参为true时，显示plan_info的信息。函数返回信息和DBE_PERF.GLOBAL_PLANCACHE_STATUS一致。具体请参见《参考》中"SQL参考 \> 函数和操作符 \> 统计信息函数"章节。                                   |
   
当设置GUC参数cursor_sharing = force时，启用自动参数化的场景下，通过EXPLAIN查看计划是否走自动参数化：
| EXPLAIN模式     | 计划展示说明                           |
|:---|:---|
| normal/pretty | 被参数化的计划会显示\[Parameterized\]的tag。 |
   
