PostgreSQL 19: pg_dump 可导出扩展统计信息

John Doe 三月 13, 2026

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

image

特性提交日志

新增 pg_restore_extended_stats () 函数。

该函数在设计上与表级、列级统计信息还原函数高度相似,但专门用于扩展统计信息(即 CREATE STATISTICS 创建的对象),支持对扩展统计信息对象进行还原。

与其他同类函数一样,该功能的目标是简化数据库集群的转储(dump)或升级流程,使得这些操作完成后不再需要执行 ANALYZE,统计信息可直接加载到目标集群中,无需在转储 / 升级后再进行额外计算。

在 pg_dump 中包含扩展统计数据。

本次提交将新增的 pg_restore_extended_stats() 函数集成到pg_dump 中,使得在指定 --statistics 参数时,能够检测扩展统计信息数据并将其包含在转储文件中。目前,可转储的扩展统计类型与该 SQL 函数所支持的类型一致:n_distinctdependencies

只要在系统表中能找到扩展统计数据,就会将其转储。若系统表为空,则不会尝试还原对应的统计数据。

讨论:https://postgr.es/m/CADkLM=dpz3KFnqP-dgJ-zvRvtjsa8UZv8wDAQdqho=qN3kX0Zg@mail.gmail.com

特性示例

PostgreSQL 新增可移植统计信息特性,通过pg_restore_relation_statspg_restore_attribute_statspg_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