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

技术原理

核心机制

SQL执行流程中,预编译计划缓存可复用从词法、语法分析到计划生成的完整流程,其中计划缓存复用效果受计划类型影响,复用成功后,每次执行仅需处理计划执行模块。

预编译阶段,将对词法语法解析、语义分析及查询重写结果进行缓存,并启动查询优化与计划生成操作,生成计划时选择Generic Plan或Custom Plan。两种计划类型具有不同特性:

  • Generic Plan:允许不同参数值使用同一执行计划。
  • Custom Plan:固化参数值至计划中,需为每个参数组合重建计划。

对于不存在绑定参数场景下,Generic Plan与Custom Plan执行计划相同,默认选择Generic Plan。

两种计划各有优势:Generic Plan可降低优化器计算开销;Custom Plan基于具体参数值进行代价估算,确保执行计划最优性。具体选择机制请参见《SQL调优指南》中“使用Plan Hint进行调优 > Custom Plan和Generic Plan选择的Hint”章节与《参考》中“数据库运行参数说明 > GUC参数说明 > 查询规划 > 其他优化器选项”章节中的“plan_cache_mode”。

计划缓存复用范围取决于计划类型:

  • Generic Plan:完整复用词法语法分析至计划生成的中间结果。
  • Custom Plan:仅复用语义解析层(词法语法分析、语义分析、查询重写)。

当计划缓存依赖的数据库对象发生变更时(如DDL修改系统表元数据),缓存计划将与新元信息不匹配导致失效。此时系统通过元数据变更事件自动触发缓存失效机制,强制在下次执行时重建计划。

接口介绍

表1 预编译计划缓存涉及的视图说明

视图

说明

PG_PREPARED_STATEMENTS

该视图显示当前会话所有可用的预备语句的信息。具体请参见《参考》中“系统表和系统视图 > 系统视图 > 其他系统视图 > PG_PREPARED_STATEMENTS”章节。

GS_ALL_PREPARED_STATEMENTS

该视图显示所有会话中可用的预备语句的信息。具体请参见《参考》中“系统表和系统视图 > 系统视图 > 其他系统视图 > GS_ALL_PREPARED_STATEMENTS”章节。

相关文档