
# 技术原理
#### 核心机制
以预编译PreparedStatement为例，计划缓存在当前会话上时，内存位置如[图1]所示，开启GPC全局共享计划后，内存位置如[图2]所示。
图1未开启GPC计划缓存内存位置图   
![](https://support.huaweicloud.com/centralized-devg-v10-gaussdb/figure/zh-cn_image_0000002590204838.png "点击放大")
图2开启GPC计划缓存后内存位置图   
![](https://support.huaweicloud.com/centralized-devg-v10-gaussdb/figure/zh-cn_image_0000002620724331.png "点击放大")
用户指定预编译计划缓存，在会话上基于指定键Key（SQL语句和会话级GUC参数）生成预编译语句，通过Key在共享计划缓存中进行匹配并直接引用已匹配的缓存计划。自动参数化、相同语句计划复用、存储过程中计划缓存共享逻辑与之类似。
#### 接口介绍
| 名称                                                                      || 说明                                                                                                                                           |
|:---|---|:---|
| GUC参数  | enable_global_plancache                                         | 控制全局计划缓存功能开启，具体请参见《参考》中"数据库运行参数说明 \> GUC参数说明 \> 查询规划 \> 其他优化器选项"章节。                                                                          |
| GUC参数  | gpc_clean_timeout                                               | 控制不使用的共享计划的保留时间，具体请参见《参考》中"数据库运行参数说明 \> GUC参数说明 \> 查询规划 \> 其他优化器选项"章节。                                                                       |
| GUC参数  | disable_gpc_store                                               | 用于阻止后续计划存入全局计划缓存，具体请参见《参考》中"数据库运行参数说明 \> GUC参数说明 \> 查询规划 \> 其他优化器选项"章节。                                                                      |
| Hint名  | no_gpc                                                          | 强制单个查询语句不在全局共享计划缓存，具体请参见《SQL调优指南》中"使用Plan Hint进行调优"章节。                                                                                       |
| 函数或视图名 | DBE_PERF.GLOBAL_PLANCACHE_STATUS                                | 该视图显示GPC全局计划缓存状态信息，具体请参见《参考》中"Schema \> DBE_PERF Schema \> Global Plancache"章节。                                                              |
| 函数或视图名 | DBE_PERF.GLOBAL_PLANCACHE_CLEAN                                 | 清理当前节点上无人使用的全局计划缓存，具体请参见《参考》中"Schema \> DBE_PERF Schema \> Global Plancache"章节。                                                              |
| 函数或视图名 | pg_catalog.plancache_status(is_with_plan)                       | 是否显示在当前节点上的全局计划缓存的状态信息，即plan_info列。入参is_with_plan为bool类型，默认值为false。当入参为true时，显示plan_info的信息。具体请参见《参考》中"SQL参考 \> 函数和操作符 \> 系统管理函数 \> 其它函数"章节。 |
| 函数或视图名 | pg_catalog.plancache_clean()                                    | 清理当前节点上无人使用的全局计划缓存，具体请参见《参考》中"SQL参考 \> 函数和操作符 \> 系统管理函数 \> 其它函数"章节。                                                                          |
| 函数或视图名 | DBE_PERF.global_plancache_clean()                               | 清理当前节点上无人使用的全局计划缓存，具体请参见《参考》中"SQL参考 \> 函数和操作符 \> 系统管理函数 \> 其它函数"章节。                                                                          |
| 函数或视图名 | DBE_PERF.global_plancache_status(is_with_plan)                  | 是否显示在当前节点上的全局计划缓存的状态信息，即plan_info列。入参is_with_plan为bool类型，默认值为false。当入参为true时，显示plan_info的信息。具体请参见《参考》中"SQL参考 \> 函数和操作符 \> 系统管理函数 \> 其它函数"章节。 |
| 函数或视图名 | pg_catalog.global_plancache_set_invalid(hashkey, unique_sql_id) | 支持通过bigint类型的入参hashkey和unique_sql_id手动失效本节点的GPC缓存计划。具体请参见《参考》中"SQL参考 \> 函数和操作符 \> 系统管理函数 \> 其它函数"章节。                                         |
| 函数或视图名 | pg_catalog.global_plancache_show_plan (hashkey, unique_sql_id)  | 通过bigint类型的入参hashkey和unique_sql_id，查看对应的GPC缓存计划。具体请参见《参考》中"SQL参考 \> 函数和操作符 \> 系统管理函数 \> 其它函数"章节。                                             |
   
