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
相关产品推荐
相关产品推荐

