
# 全局共享级计划缓存管控
#### 前提条件
- 开启PBE查询和存储过程中语句的执行计划进行缓存共享，将enable_global_plancache参数设置为on，具体设置请参见《参考》中"数据库运行参数说明 \> GUC参数说明 \> 查询规划 \> 其他优化器选项"章节。
- 启用逻辑内存管理模块，将enable_memory_limit参数设置为on，具体设置请参见《参考》中"数据库运行参数说明 \> GUC参数说明 \> 资源消耗 \> 内存"章节。设置成功后，重启数据库集群。
- 开启GPC内存管控。 将GUC参数global_plancache_memory_ratio设置为大于0的值，具体设置请参见《参考》中"数据库运行参数说明 \> GUC参数说明 \> 负载管理"章节。
  
 
#### 语法
通过gsql创建PREPARE语句，或通过JDBC创建PREPARE语句。
- 通过gsql创建：
  ```
  PREPARE name [ ( data_type [, ...] ) ] AS statement;
  ```
  

- 通过JDBC创建：
  ```
  PreparedStatement pstmt = connection.prepareStatement(sql);
  ```
  
 
#### 注意事项
1. GPC计划缓存存在并发访问，因此无法保证淘汰策略成功。
2. 达到管控上限后且GPC计划淘汰失败时，再次创建的计划将退化为会话级。
 
#### 操作步骤
1. 打开逻辑内存管理和会话级计划缓存管控，将enable_memory_limit参数设置为on，具体设置请参见《参考》中"数据库运行参数说明 \> GUC参数说明 \> 资源消耗 \> 内存"章节。设置成功后，重启数据库集群。
2. 将global_plancache_memory_ratio参数设置为30，具体设置请参见《参考》中"数据库运行参数说明 \> GUC参数说明 \> 负载管理"章节。

3. 创建大量PREPARE语句。
4. 观察内存视图，在计划缓存大小达到阈值后不再增长。
 
#### 示例
将global_plancache_memory_ratio参数设置为30，具体设置请参见《参考》中"数据库运行参数说明 \> GUC参数说明 \> 负载管理"章节。
gsql连接数据库：
```
gaussdb=# CREATE TABLE plancache_memctl_tbl (col1 int, col2 varchar(10));
NOTICE:  The 'DISTRIBUTE BY' clause is not specified. Using 'col1' as the distribution column by default.
HINT:  Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.
CREATE TABLE
gaussdb=# INSERT INTO plancache_memctl_tbl (col1, col2) VALUES (1, 'test');
INSERT 0 1
gaussdb=# SET plan_cache_mode=force_generic_plan;
SET
gaussdb=# PREPARE p1 AS SELECT * FROM plancache_memctl_tbl WHERE col1=$1;execute p1(1);
PREPARE
 col1 | col2 
------+------
    1 | test
(1 row)
gaussdb=# PREPARE p2 AS SELECT * FROM plancache_memctl_tbl WHERE col1=$1;execute p2(1);
PREPARE
 col1 | col2 
------+------
    1 | test
(1 row)
-- 创建大量计划缓存（根据业务实际进行创建，示例中不做展示）。
 
-- GPC计划内存大小。
gaussdb=# SELECT sum(size) FROM DBE_PERF.GLOBAL_PLANCACHE_STATUS;
  sum   
--------
 159744
(1 row)
gaussdb=# DROP TABLE plancache_memctl_tbl ;
DROP TABLE
```
