MySQL需启用information_schema.COLUMN_STATISTICS并执行ANALYZE TABLE UPDATE HISTOGRAM;PG直接查pg_stats视图;SQL Server用sys.dm_db_stats_histogram或DBCC SHOW_STATISTICS提取STATS_STREAM。
MySQL 中如何导出 ANALYZE TABLE 的统计结果
直接查 information_schema.statistics 或 information_schema.tables 拿不到 analyze table 产生的列级统计(比如直方图、索引基数估算值),它们只存元数据,不存采样分析结果。真正能拿到的,是 mysql 8.0+ 内置的 performance_schema.table_statistics 和 schema_table_statistics_with_buffer(非官方视图),但这些也不含直方图。
实际可行路径只有两条:一是用 SHOW INDEX + EXPLAIN FORMAT=JSON 间接推断;二是启用并查询 information_schema.COLUMN_STATISTICS(需提前开启)。
-
SET PERSIST histogram_generation_max_mem_size = 10000000;—— 否则直方图生成可能被跳过 -
ANALYZE TABLE t UPDATE HISTOGRAM ON c1, c2;—— 显式指定列,避免全表扫描开销 - 直方图只存在
information_schema.COLUMN_STATISTICS,且内容是 JSON 字符串,不是结构化字段
PostgreSQL 怎么保存 ANALYZE 后的统计信息
PG 的统计信息默认就持久化在系统表里,不用额外“导出”,关键是要知道查哪张表、哪些字段对应什么含义。
pg_stats 是最常用入口,它把 pg_class、pg_attribute、pg_statistic 三层关系做了聚合,但注意:它只显示当前用户有权限查看的表,且不包含原始采样数据(如 most_common_vals 是文本数组,histogram_bounds 是数组类型,需用 array_to_string() 转才好备份)。
- 备份前先
SELECT * FROM pg_stats WHERE schemaname = 'public' AND tablename = 'orders'; - 若要完整保留数组结构,用
COPY (SELECT ...) TO '/tmp/stats.csv' WITH CSV;,否则直接psql -c "..." > stats.sql容易丢格式 -
pg_statistic表里有stavalues1等 toasted 字段,不能直接 SELECT 出来,必须走pg_stats视图
SQL Server 的 DBCC SHOW_STATISTICS 结果怎么落盘
这个命令输出三张结果集,但 SSMS 默认只显示第一张(统计头),后两张(密度向量、直方图)容易被忽略——而真正有用的列分布数据其实在第三张里。
不能靠 SSMS 界面右键“另存为”,得用 INSERT INTO #t EXEC('DBCC SHOW_STATISTICS(...)') 拆解,或改用 sys.dm_db_stats_histogram(SQL Server 2016+)直接查第三张表的等价数据。
- 直方图步长(
STEP_NUMBER)最多 200 步,超了会合并,备份时得留意actual_number_of_steps是否等于 200 -
sys.dm_db_stats_properties只返回最后更新时间、行数、修改次数,不包含分布细节 - 如果目标是跨实例恢复统计信息,得用
CREATE STATISTICS ... WITH STATS_STREAM = 0x...,而STATS_STREAM值只能从DBCC SHOW_STATISTICS的第二结果集里提取STATS_STREAM列
备份统计信息时最容易漏掉的三个点
很多人导出了数据,还原时发现执行计划没变——不是备份失败,而是漏掉了上下文依赖项。
- MySQL 直方图依赖
innodb_stats_persistent = ON,否则重启后消失,备份了也没用 - PostgreSQL 的
pg_stats不包含n_distinct的负数值含义(比如 -1 表示“唯一”,-0.5 表示“一半唯一”),直接导出数字会丢失语义 - SQL Server 的统计信息名称(
_WA_Sys_...)是自动生成的,跨库还原时若表结构稍有不同,CREATE STATISTICS会报错,必须重命名或用WITH NORECOMPUTE避免自动更新干扰
统计信息不是快照,是带解释规则的数据。导出时多看一眼它的生成条件和消费方式,比多导一个字段更重要。










