PostgreSQL码农集散地

PostgreSQL 18 preview - vacuumdb支持跳过已有统计信息对象, 提升pg_upgrade体验

PostgreSQL 18 preview - vacuumdb支持跳过已有统计信息对象, 提升pg_upgrade体验

此前已有patch支持了统计信息的导出和导入, 并且在后来的pg_upgrade大版本升级工具中支持了该功能, 使得pg_upgrade大版本升级后, 无需执行vacuum analyze来重新收集统计信息.

  • 《PostgreSQL 18 preview - 支持统计信息导出导入, 将来用pg_upgrade大版本升级后不需要analyze了》
  • 《PostgreSQL 18 preview - 支持pg_upgrade升级大版本时迁移统计信息》

当然, 毕竟是大版本升级, 某些情况下可能统计信息不能被所有对象完全复用(例如可能一些统计信息的功能发生了变化, 需要重新生成时.). 在这个背景下, 下面的patch 让 vacuumdb 支持添加仅分析缺少统计信息的表的关系的选项.

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=9c03c8d187210f112371aab881b379bd4800562c

vacuumdb: Teach vacuum_one_database() to reuse query results.  
author Nathan Bossart <[email protected]>   
Tue, 18 Mar 2025 21:32:55 +0000 (16:32 -0500)  
committer Nathan Bossart <[email protected]>   
Tue, 18 Mar 2025 21:32:55 +0000 (16:32 -0500)  
commit 9c03c8d187210f112371aab881b379bd4800562c  
tree c9501e41de3ceb3fe5e877baced1dba4d70668bf tree  
parent a6524105d20b190fb4f5b2116e044e29be88f215 commit | diff  
vacuumdb: Teach vacuum_one_database() to reuse query results.  

Presently, each call to vacuum_one_database() queries the catalogs  
to retrieve the list of tables to process.  A follow-up commit will  
add a "missing stats only" feature to --analyze-in-stages, which
requires saving the catalog query results (since tables without  
statistics will have them after the first stage).  This commit adds  
a new parameter to vacuum_one_database() that specifies either a  
previously-retrieved list or a place to return the catalog query  
results.  Note that nothing uses this new parameter yet.  

Author: Corey Huinker <[email protected]>  
Co-authored-by: Nathan Bossart <[email protected]>  
Reviewed-by: John Naylor <[email protected]>  
Discussion: https://postgr.es/m/Z5O1bpcwDrMgyrYy%40nathan  

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=edba754f052ea0c02287080004aa6051eaa4f597

vacuumdb: Add option for analyzing only relations missing stats.  
author Nathan Bossart <[email protected]>   
Tue, 18 Mar 2025 21:32:56 +0000 (16:32 -0500)  
committer Nathan Bossart <[email protected]>   
Tue, 18 Mar 2025 21:32:56 +0000 (16:32 -0500)  
commit edba754f052ea0c02287080004aa6051eaa4f597  
tree 9a2e1bf62504689bccaa4acf3cbbc74edb8dbbe5 tree  
parent 9c03c8d187210f112371aab881b379bd4800562c commit | diff  
vacuumdb: Add option for analyzing only relations missing stats.  

This commit adds a new --missing-stats-only option that can be used  
with --analyze-only or --analyze-in-stages.  When this option is  
specified, vacuumdb will analyze a relation if it lacks any  
statistics for a column, expression index, or extended statistics  
object.  This new option is primarily intended for use after  
pg_upgrade (since it can now retain most optimizer statistics), but  
it might be useful in other situations, too.  

Author: Corey Huinker <[email protected]>  
Co-authored-by: Nathan Bossart <[email protected]>  
Reviewed-by: John Naylor <[email protected]>  
Discussion: https://postgr.es/m/Z5O1bpcwDrMgyrYy%40nathan  

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=c9d502eb68094d817fe94c2e954f6fdbb62f4d48

Update guidance for running vacuumdb after pg_upgrade.  
author Nathan Bossart <[email protected]>   
Tue, 18 Mar 2025 21:32:56 +0000 (16:32 -0500)  
committer Nathan Bossart <[email protected]>   
Tue, 18 Mar 2025 21:32:56 +0000 (16:32 -0500)  
commit c9d502eb68094d817fe94c2e954f6fdbb62f4d48  
tree 8677ddfbef8a90a709c1d7a0140800b21cca6db8 tree  
parent edba754f052ea0c02287080004aa6051eaa4f597 commit | diff  
Update guidance for running vacuumdb after pg_upgrade.  

Now that pg_upgrade can carry over most optimizer statistics, we  
should recommend using vacuumdb's new --missing-stats-only option  
to only analyze relations that are missing statistics.  

Reviewed-by: John Naylor <[email protected]>  
Discussion: https://postgr.es/m/Z5O1bpcwDrMgyrYy%40nathan  

AI 解读

这三个补丁共同改进了 vacuumdb 工具,特别是在 pg_upgrade 之后使用时的体验。

补丁 1:vacuumdb: Teach vacuum_one_database() to reuse query results. (vacuumdb: 教会 vacuum_one_database() 重用查询结果)

  • 核心功能:  修改了 vacuum_one_database() 函数,使其能够重用之前查询的结果。
  • 作用:  添加了一个新的参数到 vacuum_one_database() 函数,该参数可以指定一个之前检索到的表列表,或者一个用于返回目录查询结果的位置。
  • 目的:  为后续的补丁做准备,该补丁将为 --analyze-in-stages 添加 "missing stats only" 功能。  该功能需要保存目录查询结果,因为在第一阶段之后,没有统计信息的表将拥有统计信息。
  • 注意:  目前还没有任何代码使用这个新的参数。

补丁 2:vacuumdb: Add option for analyzing only relations missing stats. (vacuumdb: 添加仅分析缺少统计信息的表的关系的选项)

  • 核心功能:  引入了一个新的命令行选项 --missing-stats-only,用于 vacuumdb 工具。
  • 作用:  当与 --analyze-only 或 --analyze-in-stages 选项一起使用时,vacuumdb 只会分析那些缺少列、表达式索引或扩展统计对象统计信息的表。
  • 主要用途:  在 pg_upgrade 之后使用,因为 pg_upgrade 现在可以保留大部分优化器统计信息。  这样可以避免不必要的分析,从而加快升级后的数据库准备过程。  当然,这个选项在其他情况下也可能有用。

补丁 3:Update guidance for running vacuumdb after pg_upgrade. (更新在 pg_upgrade 之后运行 vacuumdb 的指南)

  • 核心功能:  更新了在 pg_upgrade 之后运行 vacuumdb 的建议。
  • 作用:  建议使用 vacuumdb 的新 --missing-stats-only 选项,只分析那些缺少统计信息的表,因为 pg_upgrade 现在可以迁移大部分优化器统计信息。

总结:

这三个补丁共同改进了 vacuumdb 工具,使其在 pg_upgrade 之后更加高效和易用。

  • 第一个补丁引入了 --missing-stats-only 选项,允许只分析缺少统计信息的表,从而减少了不必要的分析。
  • 第二个补丁修改了 vacuum_one_database() 函数,使其能够重用查询结果,为后续的改进做准备。
  • 第三个补丁更新了文档,建议在 pg_upgrade 之后使用 --missing-stats-only 选项。

这些改进使得在 pg_upgrade 之后准备数据库更加快速和高效。

关键术语解释:

  • vacuumdb:  PostgreSQL 的一个命令行工具,用于清理和分析数据库。
  • pg_upgrade:  PostgreSQL 的一个工具,用于将数据库升级到新版本。
  • --analyze-only:vacuumdb 的一个选项,只分析数据库,而不进行清理。
  • --analyze-in-stages:vacuumdb 的一个选项,分阶段分析数据库。
  • --missing-stats-only:vacuumdb 的一个新选项,只分析缺少统计信息的表。
  • 优化器统计信息 (Optimizer Statistics):  关于表数据的统计信息,用于优化查询执行计划。
  • 目录 (Catalog):  PostgreSQL 的系统表,存储关于数据库对象的信息。
  • vacuum_one_database():vacuumdb 工具内部的一个函数,用于处理单个数据库。

总而言之,这些补丁通过引入新的选项和改进内部函数,使得 vacuumdb 在 pg_upgrade 之后更加高效和易用,减少了不必要的分析,从而加快了升级后的数据库准备过程。