
# 特性概述
#### 功能定义
用户可指定相同的SQL模板语句，重复执行该语句时可以跳过解析和计划生成操作，复用上次执行时生成的计划缓存，从而提升执行速度。用户可以在SQL语句上设置绑定参数，每次执行时绑定不同参数，复用计划模板。可分为以下步骤：
- 预编译阶段：发送一个SQL语句（可绑定参数），并提供一个语句名作为键Key。
- 执行阶段：指定语句名Key，并提供参数值以执行已编译缓存的SQL语句。 其中绑定参数非必选项，需要在相同SQL模板上设置不同参数时指定即可。当业务涉及的SQL查询重复率高时，适合使用预编译计划缓存的方式执行。
  
可通过JDBC中PreparedStatement相关方法、gsql中PREPARE EXECUTE语法等方式使用预编译计划缓存功能。JDBC具体用法请参见[执行SQL语句](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/gaussdb-12-0087.html)，PREPARE EXECUTE具体用法请参见《参考》中"SQL参考 \> SQL语法 \> P \> PREPARE"章节。
在存储过程定义中的固定SQL语句默认会在第一次执行时将SQL语句解析并生成计划缓存，可复用计划。
#### 规格约束
1. 预编译的语句和对应Key为会话级别（并非全局共享），只能在本会话内使用Key映射到预期计划中，当计划无法共享时，计划也为会话内私有。
2. 在生成Generic Plan复用缓存计划时，如果修改仅影响计划的GUC参数，不会直接生效影响正在执行的复用计划。在生成Custom Plan的时，计划每次会新建，修改仅影响计划的GUC参数会及时生效。
3. 如果计划缓存所依赖的对象发生变化（如：表被执行ALTER修改或ANALYZE刷新）时，计划缓存会由于依赖对象元信息发生变化而被标记为失效，触发计划失效后，会引发计划重建以及系统开销，可能引发性能波动。
4. 如果预备语句所依赖的表结构发生变化（例如添加、删除或修改列定义），缓存计划中期望的结果结构可能与实际的表结构不匹配，后续执行该语句时，将导致非预期结果。
 
