0

0

postgresql统计信息如何更新_postgresqlanalyze机制说明

尊渡假赌尊渡假赌尊渡假赌

尊渡假赌尊渡假赌尊渡假赌

发布时间:2025-11-22 13:55:02

|

402人浏览过

|

来源于php中文网

原创

PostgreSQL通过ANALYZE命令收集表和列的统计信息,帮助查询优化器选择高效执行计划。统计内容包括不同值数量、最常见值、直方图和NULL比例,存储于pg_statistic系统表。ANALYZE采用采样机制,受default_statistics_target参数控制,默认目标值为100,值越高统计越准但耗时增加。自动更新由autovacuum触发,条件为修改行数超过autovacuum_analyze_threshold与scale_factor乘积之和,例如10万行表约在10050次更改后触发。可通过查询pg_stat_user_tables监控分析时间和数据变更。尽管有自动机制,仍需在大批量导入、执行计划异常或结构变更后手动执行ANALYZE。最佳实践包括定期对关键表分析、仅分析大表的关键列以降低开销,并结合EXPLAIN验证执行计划改进效果。保持统计信息及时更新是维持查询性能稳定的重要手段。

postgresql统计信息如何更新_postgresqlanalyze机制说明

PostgreSQL中的统计信息对查询优化器至关重要,它依赖这些数据来生成高效的执行计划。如果统计信息不准确或过时,可能导致索引未被使用、全表扫描代替索引扫描等问题,进而影响性能。因此,及时更新统计信息是数据库维护的重要环节。

统计信息的作用

PostgreSQL的查询规划器会根据表和列的统计信息估算查询结果的行数、选择性以及访问路径的成本。这些统计信息存储在系统表pg_statistic中,由ANALYZE命令收集。常见的统计内容包括:

  • 每列的不同值数量(ndistinct)
  • 最常见值及其频率(MCV)
  • 直方图(histogram),用于评估范围查询的选择性
  • NULL值比例

这些信息帮助优化器判断走索引是否划算,或者选择哪个连接顺序更高效。

ANALYZE 命令的工作机制

ANALYZE 是用来收集表统计信息的核心命令。它可以运行在整库、单个表或特定列上。

基本语法如下:

ANALYZE table_name(column1, column2);

若不指定表或列,则对整个数据库中所有需要分析的表进行处理(通常是指自上次分析后有数据变更的表)。

ANALYZE 的采样机制:为了效率,PostgreSQL不会扫描整张表,而是按一定策略抽样数据页和元组。采样规模受参数 default_statistics_target 和表级别的 STATISTICS_TARGET 控制,默认目标值为100。该值越高,采样越多,统计越精确,但分析耗时也增加。

自动更新统计信息:Autovacuum 与 AUTOANALYZE

PostgreSQL通过autovacuum进程实现统计信息的自动更新。当表的数据发生足够多的更改(插入、更新、删除)时,会触发一次自动的ANALYZE操作。

didicms企业网站管理系统 Build 110509
didicms企业网站管理系统 Build 110509

程序说明: 模板化制作,修改更加简单。 后台登陆地址:/admin/login.asp 帐号密码都是admin 后台说明如下 站点配置管理:可修改站点名称公司联系方式和版权信息等。 首页幻灯管理:可修改首页幻灯,共计5个,自由修改。 频道分类管理:自由设置网站分类,使网站扩展性能更强。 企业信息管理:自由增加单页面,自由调用。 信息发布管理:可以添加修改删除各种产品信息,新闻信息等。 客户留言管理

下载

触发条件由以下参数控制:

  • autovacuum_analyze_threshold:最小修改行数阈值,默认50
  • autovacuum_analyze_scale_factor:按表大小比例计算的增量因子,默认0.1(即10%)

实际触发条件为:已修改行数 > threshold + scale_factor × 表总行数

例如,一张10万行的表,默认将在约 50 + 0.1×100000 = 10050 次更改后触发AUTOANALYZE。

可通过以下SQL查看各表最后分析时间及行修改量:

SELECT relname, last_analyze, last_autoanalyze, n_tup_ins, n_tup_upd, n_tup_del 
FROM pg_stat_user_tables;

手动更新统计信息的最佳实践

尽管有自动机制,但在某些场景下仍需手动执行ANALYZE

  • 大批量导入或ETL操作完成后
  • 重要查询执行计划异常,怀疑统计不准
  • 表结构变更后(如新增索引、重写列)
  • 小表频繁更新但未达autovacuum阈值

建议做法:

  • 对关键业务表定期安排ANALYZE任务(如夜间作业)
  • 对大表可只分析关键列,减少开销:ANALYZE tbl(col_a, col_b);
  • 结合EXPLAIN验证执行计划是否改善

基本上就这些。保持统计信息新鲜,是保障查询性能稳定的基础措施之一。合理配置autoanalyze参数并辅以必要的人工干预,能有效避免因统计偏差导致的性能问题。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

679

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

320

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

346

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1095

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

357

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

675

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

574

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

415

2024.04.29

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

40

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号