
# 常见问题
1. **问题现象：** 为什么计划缓存没有复用？
   **原因分析：**preparethreshold等url参数设置不当会引发计划无法缓存复用。
   **解决办法：** 请参见[连接参数参考](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/gaussdb-12-0086.html)章节。预计在第prepareThreshold次发送SQL时才会指定语句Key，在会话上缓存计划并等待后续复用。在第prepareThreshold次前，发送的是不带语句Key的unnamed语句，这种语句的计划无法复用，每次下发新的SQL会被清理覆盖。
   
2. **问题现象：** 计划缓存过多时怎么办？
   **原因分析：**JDBC反复创建新预编译语句，并对原始语句并未进行关闭，会引发计划缓存过多的问题。url参数中preparedStatementCacheQueries和preparedStatementCacheSizeMiB可控制一个会话上的缓存query数量。但需要JDBC指定的预编译语句已经调用了close方法。
   **解决办法：**可修改JDBC语句，主动关闭不再使用的预编译语句，或者通过GaussDB的计划缓存内存上限管控功能控制。
   
3. **问题现象：** 特定SQL语句在启用Custom Plan时执行正常，但在启用Generic Plan时执行报错。
   **原因分析：**Custom Plan和Generic Plan在生成阶段处理参数的方式存在差异。例如，对于包含t1 FULL JOIN t2 ON $1的查询：
   - Custom Plan： 执行时会将传入参数（$1）解析为具体常量值。优化器可利用此常量（如：识别为布尔值TRUE）生成高效的执行路径（如：MERGE JOIN）。
   
   - Generic Plan： 生成计划时不会对参数（$1）进行求值，仅将其视为未知值。因此，优化器无法基于常量条件进行特定优化（如：转换为MERGE JOIN），可能导致无法生成有效计划或选择了错误的计划。
   
   
   最终表现为：该SQL在前N次（使用Custom Plan）执行成功，第N+1次及之后（可能切换为Generic Plan）执行失败。
   **解决办法：**针对此类特定SQL语句，可通过以下方式强制启用Custom Plan：
   - 在应用连接串中设置参数，调整连接参数。
   
   - 使用执行计划优化（Hint）， 在SQL语句中嵌入特定数据库的Hint。
    
 
