更新时间:2025-07-08 GMT+08:00
分享

更新统计信息

在数据库中,统计信息是规划器生成计划的源数据。没有收集统计信息或者统计信息陈旧会造成执行计划严重劣化,从而导致性能问题。

背景信息

ANALYZE语句可收集与数据库中表内容相关的统计信息,统计结果存储在系统表PG_STATISTIC中。查询优化器会使用这些统计数据,以生成最有效的执行计划。

建议在执行了大批量插入/删除操作后,例行对表或全库执行ANALYZE语句更新统计信息。目前默认收集统计信息的采样比例是30000行(即:guc参数default_statistics_target默认设置为100),如果表的总行数超过一定行数(大于1600000),建议设置guc参数default_statistics_target为-2,即按2%收集样本估算统计信息。

对于在批处理脚本或者存储过程中生成的中间表,也需要在完成数据生成之后显式地调用ANALYZE。

对于表中多个列有相关性且查询中有同时基于这些列的条件或分组操作的情况,可尝试收集多列统计信息,以便查询优化器可以更准确地估算行数,并生成更有效的执行计划。

生成统计信息

更新单个表的统计信息。
1
ANALYZE tablename; 

使用EXPLAIN查看各SQL的执行计划时,如果发现某个表SEQ SCAN的输出中rows=10,rows=10是系统给的默认值,有可能该表没有进行ANALYZE,需要对该表执行ANALYZE。

提升统计信息质量

ANALYZE是按照随机采样算法从表上采样,根据样本计算表数据特征。采样数可以通过配置参数default_statistics_target进行控制,default_statistics_target取值范围为-100~10000,默认值为100。

  • 当default_statistics_target > 0时;采样的样本数为300*default_statistics_target,default_statistics_target取值越大,采样的样本也越大,样本占用的内存空间也越大,统计信息计算耗时也越长。
  • 当default_statistics_target < 0时,采样的样本数为 (default_statistics_target)/100*表的总行数,default_statistics_target取值越小,采样的样本也越大。当default_statistics_target < 0时会把采样数据下盘,不存在样本占用的内存空间的问题,但是因为样本过大,计算耗时长的问题同样存在。

    default_statistics_target < 0时,实际采样数是 (default_statistics_target)/100*表的总行,所以又称之为百分比采样。

自动收集统计信息

当配置参数autoanalyze打开时,查询语句走到优化器发现表不存在统计信息或数据变化超过阈值时,会自动触发统计信息收集,以满足优化器的需求。

基于代价的优化器模型(CBO,cost base optimizer)中,统计信息决定了查询计划生成的好坏。因此,统计信息的及时有效很重要。

  • 表级统计信息,存储在pg_class的relpages、reltuples中。
  • 列级统计信息,存储在pg_statistics中,可以通过pg_stats视图查看。包括:NULL值比例,distinct值占比,高频值MCV,直方图histgram等。

收集条件:当数据量发生较大变化,默认是变化10%,认为数据特征已经有了变化,需要重新收集统计信息。

准确性

表1 准确性

分类

说明

采样大小

可配置为按表大小自适应。由参数default_statistics_target控制。

采样随机性

  • analyze_sample_mode参数设置新支持优化蓄水池和range采样随机性更优。
  • random_function_version参数增强了随机数计算函数的随机性。

统计信息推算

enable_extrapolation_stats参数可以控制估算失真时,基于旧的统计信息自动推算更准确的统计信息。

统计信息查看

查看lake formation上的统计信息。

1
desc extended relation;

相关文档