查询优化器需要准确预估查询在各个计算节点上产出的数据行数,以此作为代价权衡的依据。系统目录视图 pg_stats(基于底层的 pg_statistic 映射而来)存储了通过 ANALYZE 命令采集的单列物理统计信息:
null_frac:该字段中 NULL 空值所占的比例。
avg_width:该字段在磁盘存储上的平均字节物理宽度。
n_distinct:该字段在全表中的唯一不同取值数(若为负数,代表唯一值占总行数的比例)。
most_common_vals 与 most_common_freqs:高频热点值清单(MCV)及其各自对应的全局出现频次。
histogram_bounds:用于等频区间划分的直方图(Histogram),优化器利用直方图能够以极高精度预估范围查询(如 x > 100 AND x < 500)的选择度。
correlation:字段值的逻辑排序与行在物理磁盘页面上的存储顺序之间的统计相关系数。系数接近 +1 或 -1 表明物理存储与逻辑排序高度一致,走索引扫描仅需极少量顺序磁盘 I/O。
单列统计信息默认假定不同字段之间的取值分布是完全统计独立的。然而在真实业务中,字段之间常常存在强烈的内在关联(例如“城市”字段与“省份/国家”字段之间具有完全的函数依赖)。单纯基于单列统计相乘会严重低估联合过滤的选择度,误导优化器选错计划。
通过使用 CREATE STATISTICS 命令,可以为多列组合创建扩展统计信息:
CREATE STATISTICS stts (dependencies) ON city, state FROM cities; ANALYZE cities;
系统在底层会专门采集多列之间的函数依赖强度(Functional Dependencies)、多列唯一值统计以及多列联合高频值清单(Multivariate MCV),使优化器在面对复杂的复合条件查询时依然能够做出极其精准的行数估算。