ぱと隊長日誌

ブログ運用もエンジニアとしての生き方も模索中

PostgreSQL の autovacuum は定期的な VACUUM ANALYZE 実行の代替となる

概要

PostgreSQL のドキュメントでは、バージョン14まで「定期的な VACUUM ANALYZE の実行」が推奨されていました。しかし、バージョン15からはその記載が変更され、autovacuum 機能の活用が強く示唆されています。本記事では、この変更の背景と実運用への影響について解説します。

バージョン14までの推奨事項

PostgreSQL 14 のドキュメントでは、以下のように記載されていました。

不要となった行を削除するため、実運用状態のデータベースに対しては定期的に(少なくとも毎晩)VACUUMを実行することを推奨します。また、テーブルに対して多数の行を追加/削除した後は、そのテーブルにVACUUM ANALYZEを発行することを推奨します。これによりシステムカタログに最近なされた全ての変更が反映されることになり、PostgreSQLの問い合わせプランナが、問い合わせ計画の作成時により良い選択をできるようになります。

VACUUM

この推奨は autovacuum が存在しない、もしくは信頼性が十分でなかった時代の運用を前提としていました。

バージョン15以降の変更点

PostgreSQL 15 のドキュメントでは、以下のように記載が更新されています。

無効な行を削除するために、データベースすべてを定期的にバキュームすることをお勧めします。PostgreSQLには、バキューム保守作業を自動化する「autovacuum」機能があります。

VACUUM

この変更により、従来の「定期的な VACUUM ANALYZE の実行」の推奨が撤廃され、autovacuum の活用が前提とされました。

変更の背景

コミットログでは、この変更理由が以下のように説明されています。

Remove outdated recommendation for manual VACUUM

We have had a working and tunable autovacuum for at least a decade now, so remove the recommendation to manually vacuum tables at least every night.
Autovacuum is now also triggered by INSERTs, so we can also remove the recommendation to run VACUUM (ANALYZE) after lots of INSERTs or DELETEs.

Instead, suggest using autovacuum by moving the respective paragraph up to where the importance of VACUUM is emphasized.

Remove outdated recommendation for manual VACUUM · postgres/postgres@27f953e · GitHub

さらに、メーリングリストの議論では、autovacuum が存在しない、もしくは信頼性の低い時代には VACUUM の定期実行が妥当だったが、現在は autovacuum を推奨すべきと指摘しています。
参考:
PostgreSQL: Remove recommendation for nightly VACUUM

autovacuum は ANALYZE も自動化する

autovacuum は単に VACUUM を実行するだけではなく、ANALYZE も自動的に実行します。

PostgreSQLには、省略可能ですが強く推奨される自動バキュームという機能があります。これはVACUUMとANALYZEコマンドの実行を自動化することを目的としたものです。
(中略)
デフォルトの設定では、自動バキュームは有効で、関連するパラメータも適切に設定されています。

25.1. 定常的なバキューム作業

このため、autovacuum が正常に機能している環境では、VACUUM ANALYZE を定期実行する必要は基本的にありません。

運用の見直しを検討するタイミング

  • 既存環境で定期的に VACUUM ANALYZE を実行している場合
    • すぐに変更する必要はありませんが、autovacuum の設定が適切かを確認するとよいでしょう。
  • 新規構築や大規模な運用見直しの機会
    • VACUUM の定期実行を前提とした運用を見直し、autovacuum の活用をお勧めします。

まとめ

PostgreSQL の進化により、autovacuum は信頼性の高い運用手法として確立されています。従来の「定期的な VACUUM ANALYZE の実行」という前提を見直し、autovacuum を活用した効率的なデータベース管理を目指しましょう。