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

技术原理

核心机制

以预编译PreparedStatement为例,计划缓存在当前会话上时,内存位置如图1所示,开启GPC全局共享计划后,内存位置如图2所示。

图1 未开启GPC计划缓存内存位置图
图2 开启GPC计划缓存后内存位置图

用户指定预编译计划缓存,在会话上基于指定键Key(SQL语句和会话级GUC参数)生成预编译语句,通过Key在共享计划缓存中进行匹配并直接引用已匹配的缓存计划。自动参数化、相同语句计划复用、存储过程中计划缓存共享逻辑与之类似。

接口介绍

名称

说明

GUC参数

enable_global_plancache

控制全局计划缓存功能开启,具体请参见《参考》中“数据库运行参数说明 > GUC参数说明 > 查询规划 > 其他优化器选项”章节。

gpc_clean_timeout

控制不使用的共享计划的保留时间,具体请参见《参考》中“数据库运行参数说明 > GUC参数说明 > 查询规划 > 其他优化器选项”章节。

disable_gpc_store

用于阻止后续计划存入全局计划缓存,具体请参见《参考》中“数据库运行参数说明 > GUC参数说明 > 查询规划 > 其他优化器选项”章节。

Hint名

no_gpc

强制单个查询语句不在全局共享计划缓存,具体请参见《SQL调优指南》中“使用Plan Hint进行调优”章节。

函数或视图名

DBE_PERF.GLOBAL_PLANCACHE_STATUS

该视图显示GPC全局计划缓存状态信息,具体请参见《参考》中“Schema > DBE_PERF Schema > Global Plancache”章节。

DBE_PERF.GLOBAL_PLANCACHE_CLEAN

清理当前节点上无人使用的全局计划缓存,具体请参见《参考》中“Schema > DBE_PERF Schema > Global Plancache”章节。

pg_catalog.plancache_status(is_with_plan)

是否显示在当前节点上的全局计划缓存的状态信息,即plan_info列。入参is_with_plan为bool类型,默认值为false。当入参为true时,显示plan_info的信息。具体请参见《参考》中“SQL参考 > 函数和操作符 > 系统管理函数 > 其它函数”章节。

pg_catalog.plancache_clean()

清理当前节点上无人使用的全局计划缓存,具体请参见《参考》中“SQL参考 > 函数和操作符 > 系统管理函数 > 其它函数”章节。

DBE_PERF.global_plancache_clean()

清理当前节点上无人使用的全局计划缓存,具体请参见《参考》中“SQL参考 > 函数和操作符 > 系统管理函数 > 其它函数”章节。

DBE_PERF.global_plancache_status(is_with_plan)

是否显示在当前节点上的全局计划缓存的状态信息,即plan_info列。入参is_with_plan为bool类型,默认值为false。当入参为true时,显示plan_info的信息。具体请参见《参考》中“SQL参考 > 函数和操作符 > 系统管理函数 > 其它函数”章节。

pg_catalog.global_plancache_set_invalid(hashkey, unique_sql_id)

支持通过bigint类型的入参hashkey和unique_sql_id手动失效本节点的GPC缓存计划。具体请参见《参考》中“SQL参考 > 函数和操作符 > 系统管理函数 > 其它函数”章节。

pg_catalog.global_plancache_show_plan (hashkey, unique_sql_id)

通过bigint类型的入参hashkey和unique_sql_id,查看对应的GPC缓存计划。具体请参见《参考》中“SQL参考 > 函数和操作符 > 系统管理函数 > 其它函数”章节。

相关文档