更新时间:2026-07-28 GMT+08:00
分享

常见问题

  1. 问题现象:为什么计划缓存没有复用?

    原因分析:preparethreshold等url参数设置不当会引发计划无法缓存复用。

    解决办法:请参见连接参数参考章节。预计在第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。

相关文档