You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL查询执行计划是否被持久化存储?及缓存机制疑问

PostgreSQL 查询执行计划的存储与缓存机制详解

好问题!咱们把你的疑问拆成几个关键点来解答:

1. 执行计划是否会被持久存储(会话结束后仍可访问)?

默认情况下,PostgreSQL 不会将执行计划持久化存储到系统视图或磁盘中:

  • pg_stat_statements 仅存储语句的执行统计(比如执行次数、总耗时、返回行数等),不包含执行计划本身;
  • pg_prepared_statements 只保存准备好的SQL语句文本,以及一些基本元数据(比如参数类型),同样没有执行计划的内容。

如果需要在会话结束后仍能访问执行计划,你得手动保存:

  • 用 EXPLAIN ANALYZE INTO my_plan_table SELECT ... 把执行计划结果写入自定义表;
  • 借助第三方扩展(比如 pg_stat_plans),它能跟踪并存储执行计划的相关信息,但需要提前安装启用。

2. PostgreSQL 完全不缓存查询执行计划?这个说法不准确!

PostgreSQL 并非完全不缓存执行计划,它有两种会话级的缓存机制:

  • 普通语句的会话缓存:在同一个会话内,重复执行的相同SQL文本(或参数化语句),第一次执行时生成的执行计划会被缓存,后续执行直接复用,直到以下情况发生:
    • 会话结束;
    • 涉及的表发生结构变更(比如ALTER TABLE);
    • 表的统计信息被更新(比如ANALYZE);
    • 相关配置参数(比如work_mem)被修改。
  • 准备语句的计划缓存:用 PREPARE 创建的语句,其执行计划会被缓存到当前会话的内存中,每次 EXECUTE 时直接复用。但注意,这个计划只在当前会话有效,会话结束后就会被销毁,而且 pg_prepared_statements 里看不到具体的计划内容。

需要强调的是:PostgreSQL 没有全局共享的执行计划缓存(类似Oracle的共享池),每个会话的计划缓存都是独立的,跨会话无法复用。

3. 为什么系统视图里看不到执行计划?

执行计划本质是会话内的内存结构,PostgreSQL 默认不会把这些内存结构暴露到系统视图中。如果想查看当前会话或全局的缓存计划,可以:

  • 安装并启用 pg_stat_plans 扩展,它会提供 pg_stat_plans 视图,包含缓存的执行计划文本和相关统计;
  • 在当前会话中,对准备好的语句执行 EXPLAIN EXECUTE prepared_stmt_name;,可以查看其当前使用的执行计划。

内容的提问来源于stack exchange,提问作者nayır nolamaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:50:44