由 John Doe 三月 13, 2026
统计信息对于查询性能影响重大,现在 PostgreSQL 实现了统计信息导出和恢复的完整闭环。

特性提交日志
新增 pg_restore_extended_stats () 函数。
该函数在设计上与表级、列级统计信息还原函数高度相似,但专门用于扩展统计信息(即 CREATE STATISTICS 创建的对象),支持对扩展统计信息对象进行还原。
与其他同类函数一样,该功能的目标是简化数据库集群的转储(dump)或升级流程,使得这些操作完成后不再需要执行 ANALYZE,统计信息可直接加载到目标集群中,无需在转储 / 升级后再进行额外计算。
在 pg_dump 中包含扩展统计数据。
本次提交将新增的 pg_restore_extended_stats() 函数集成到pg_dump 中,使得在指定 --statistics 参数时,能够检测扩展统计信息数据并将其包含在转储文件中。目前,可转储的扩展统计类型与该 SQL 函数所支持的类型一致:n_distinct和dependencies。
只要在系统表中能找到扩展统计数据,就会将其转储。若系统表为空,则不会尝试还原对应的统计数据。
讨论:https://postgr.es/m/CADkLM=dpz3KFnqP-dgJ-zvRvtjsa8UZv8wDAQdqho=qN3kX0Zg@mail.gmail.com
特性示例
PostgreSQL 新增可移植统计信息特性,通过pg_restore_relation_stats、pg_restore_attribute_stats、pg_restore_extended_stats三个函数,结合pg_dump工具,可实现统计信息的导出与还原,无需执行ANALYZE,大幅简化集群转储、升级及测试环境对齐流程。下面让我们来实际演示下。
通过pg_dump的相关参数,可快速导出生产环境统计信息。关键参数有:
-
--statistics:导出统计信息(需显式指定) -
--statistics-only:仅导出统计信息,不包含表结构和数据
我们在数据库中有一个简单的订单表:
CREATE TABLE orders (
id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
customer_id integer NOT NULL,
amount numeric(10,2) NOT NULL,
status text NOT NULL DEFAULT 'pending',
created_at date NOT NULL DEFAULT CURRENT_DATE
);
使用以上参数选项进行导出:
# 仅导出生产库统计信息(推荐用于统计迁移)
pg_dump --statistics-only -d production_db > stats.sql
# 导出表结构+统计信息(用于测试环境搭建)
pg_dump --schema-only --statistics -d production_db > schema_with_stats.sql
导出文件为纯 SQL 格式,包含了三个还原函数的调用语句。三个函数分别对应表级、列级、扩展级统计信息还原,参数简洁,可直接执行导入。
pg_restore_relation_stats(表级统计还原)
用于还原表的整体统计信息(如行数、数据页数),定位表级数据规模。
-- 还原public模式下orders表的表级统计
SELECT pg_restore_relation_stats(
'schemaname', 'public',
'relname', 'orders',
'relpages', 123513::integer, -- 数据页数
'reltuples', 50000000::real, -- 预估行数
'relallvisible', 123513::integer
);
pg_restore_attribute_stats(列级统计还原)
用于还原列的详细统计(如直方图、高频值),决定查询优化器的执行计划选择。
-- 还原orders表created_at列的列级统计
SELECT pg_restore_attribute_stats(
'schemaname', 'public',
'relname', 'orders',
'attname', 'created_at',
'inherited', false::boolean,
'null_frac', 0.0::real, -- 空值比例
'histogram_bounds', '{2019-01-01,2024-01-01}'::text, -- 直方图边界
'correlation', 0.98::real -- 列排序与物理存储相关性
);
pg_restore_extended_stats(扩展统计还原)
用于还原CREATE STATISTICS创建的扩展统计信息,目前支持n_distinct(唯一值计数)和dependencies(列依赖)。
-- 还原orders表的扩展统计(n_distinct类型)
SELECT pg_restore_extended_stats(
'rel_schemaname', 'public',
'relname', 'orders',
'statistics_schemaname', 'public',
'statistics_name', 'orders_ext_stats', -- 扩展统计对象名
'inherited', false::boolean,
'n_distinct', '[{"attributes" : [2,3], "ndistinct" : 4}]'::pg_ndistinct -- 多列唯一值统计
);
典型使用场景
1. 测试环境对齐:导出生产统计信息,注入测试库,无需模拟海量数据即可获得与生产一致的查询计划;
2. 集群升级:升级后直接还原统计信息,避免执行耗时的ANALYZE;
3. 故障调试:将生产统计信息导入本地环境,还原生产查询执行逻辑,快速定位性能问题。
非常不错的体验,感谢所有参与的社区人员。
参考
提交日志:https://git.postgresql.org/pg/commitdiff/c32fb29e979db4a7b92adb29007725eeacf91f64