

# 使用共享计划缓存
<a name="apg-shared-plan-cache"></a>

## 概述
<a name="apg-shared-plan-cache-overview"></a>

Aurora PostgreSQL 使用 process-per-user（每用户进程）模式，在这种模式下，每个客户端连接都会创建一个专用的后端进程。每个后端进程都为预准备语句维护其自己的本地计划缓存。由于这些缓存无法在进程之间共享，因此，使用许多预准备语句的应用程序可能会在不同的后端进程之间创建重复的缓存，从而导致内存使用量增加。

Aurora PostgreSQL 版本 17.6 及更高版本和 16.10 及更高版本引入了共享计划缓存功能。启用此功能后，后端进程可以共享通用计划，从而通过消除重复的计划生成来减少内存使用量并提高性能。

共享计划缓存使用以下组件作为其缓存密钥：
+ 查询字符串（包括注释）
+ 与规划程序相关的 GUC 参数（包括 `search_path`）
+ 用户 ID
+ 数据库 ID

实例重启会重置共享缓存。

## 参数
<a name="apg-shared-plan-cache-parameters"></a>

下表介绍用于控制共享计划缓存功能的参数：


| 参数 | 说明 | 默认值 | 已允许 | 
| --- | --- | --- | --- | 
| apg\$1shared\$1plan\$1cache.enable | 开启或关闭共享计划缓存 | 0（关闭） | 0, 1 | 
| apg\$1shared\$1plan\$1cache.max | 最大缓存条目数量 | 200–1000（视实例大小而定） | 100–50000 | 
| apg\$1shared\$1plan\$1cache.min\$1size\$1per\$1entry | 要存储在共享缓存中的最小计划大小。较小的计划使用本地缓存来优化 OLTP 性能。 | 16 KB | 0–32768（KB） | 
| apg\$1shared\$1plan\$1cache.max\$1size\$1per\$1entry | 共享缓存的最大计划大小。更大的计划仅存储成本信息。 | 256 KB–4 MB（视实例大小而定） | 0–32768（KB） | 
| apg\$1shared\$1plan\$1cache.idle\$1generic\$1plan\$1release\$1timeout | 一个时间，空闲会话在该时间之后发布本地通用计划。值较低可以节省内存；值较高可能会提高性能。 | 10 秒 | 0–2147483647（毫秒） | 

**注意**  
无需重新启动即可修改所有参数。

## 监控视图和函数
<a name="apg-shared-plan-cache-monitoring"></a>
+ `apg_shared_plan_cache()`：显示详细的缓存条目信息（命中、有效性、时间戳）
+ `apg_shared_plan_cache_stat()`：显示实例级别的统计数据（驱逐、失效）
+ `apg_shared_plan_cache_reset()`：移除 `apg_shared_plan_cache()` 和 `apg_shared_plan_cache_stat()` 中的所有条目
+ `apg_shared_plan_cache_remove(cache_key)`：从条目与 `cache_key` 匹配的 `apg_shared_plan_cache()` 中移除该条目

## 限制
<a name="apg-shared-plan-cache-limitations"></a>
+ 仅适用于预准备语句，而不缓存 PL/pgSQL 语句
+ 不缓存包含临时表或目录表的查询
+ 不缓存依赖于 RLS（行级安全性）的查询
+ 每个副本都保持其自己的缓存（没有跨副本共享）