VACUUM、autovacuum、vacuum_cost_delay
大規模テーブルに向けて、autovacuumのしきい値、vacuum_cost_delay、並列VACUUMを調整します。
「VACUUM、autovacuum、vacuum_cost_delay」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
3 つの VACUUM モード
VACUUM(遅延モード) — デッド行を回収し、空き領域マップを更新します。排他的ロックは取得しませんVACUUM FULL— テーブルを書き換えます。排他的ロックを取得し、ディスク領域を OS に返しますVACUUM ANALYZE— VACUUM とプランナー統計の更新を一度に実行します
VACUUM の手動実行
Autovacuum が有効な場合でも、役立つことがあります。
VACUUM (VERBOSE) orders;
VACUUM (VERBOSE, ANALYZE) orders;
VACUUM (PARALLEL 4) orders; -- parallel index cleanup (PG 13+)Autovacuum のプロセス
バックグラウンドランチャーがワーカーを起動し、しきい値を超えたテーブルをバキュームします。デフォルトでは、少数のワーカーがクラスターを処理します。
テーブル単位の調整
頻繁に更新されるテーブルでは、積極的な autovacuum が効果的です。
ALTER TABLE busy_table SET (
autovacuum_vacuum_scale_factor = 0.05, -- 5% dead vs default 20%
autovacuum_vacuum_threshold = 1000,
autovacuum_analyze_scale_factor = 0.05
);vacuum_cost_delay
VACUUM の I/O を制限し、フォアグラウンドのクエリへの影響を抑えます。PG 12 以降のデフォルトは 2ms で、通常は問題ありません。SSD では、値を小さくできます。
autovacuum_vacuum_cost_delay = 2ms
-- Lower delay = faster vacuum, more I/O usage.
-- Set per-table for hot tables that need faster cleanup.並列 VACUUM
PG 13 以降、VACUUM はインデックスのクリーンアップを並列化します。
VACUUM (PARALLEL 4) big_table;
-- Each index cleaned by a parallel worker (up to max_parallel_maintenance_workers).VACUUM FULL:いつ、なぜ使うのか
テーブルを最初から書き換え、領域を OS に返します。ACCESS EXCLUSIVE を取得します。最後の手段としてのみ使用するか、代わりに pg_repack を使用してください。
VACUUM FULL orders;
-- Locks orders; rewrites; on huge tables this is hours of downtime.pg_repack:オンラインの代替手段
テーブルをオンラインで書き換え、完全なロックを取得しません。VACUUM FULL と同じ効果があり、本番環境で使いやすい方法です。
pg_repack -d mydb -t orders
-- Builds a shadow table, sync, swaps in.Autovacuum の監視
最後に vacuum/analyze を実行した時刻と、デッドタプル数を確認します。
SELECT relname,
n_live_tup, n_dead_tup,
last_autovacuum, last_autoanalyze
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC;Autovacuum が遅れている場合
症状:
- 膨張が進む
- pg_stat_user_tables の n_dead_tup が高い
- クエリプランが悪化する
対策:autovacuum_max_workers を増やし、テーブルごとのスケールファクターを下げ、VACUUM を妨げている長時間のトランザクションを解消します。
Vacuum のログ出力
調整のために、時間のかかる vacuum をログに記録します。
log_autovacuum_min_duration = '500ms'
-- Logs every autovacuum action that took longer than 500ms.FREEZE
VACUUM は、xid のラップアラウンドを防ぐために、古いタプルを定期的に「凍結」します。積極的な autovacuum によって freeze age を低く保ち、緊急のラップアラウンドを防止できます。
まとめ
Autovacuum は不可欠であり、ワークロードに合わせて調整します。
- 頻繁に更新されるテーブルには、テーブル単位の autovacuum 設定を使用します
- VACUUM FULL は最後の手段とし、pg_repack を優先します
- n_dead_tup と last_autovacuum を監視します
- クリーンアップを妨げる長時間のトランザクションを解消します
クイックチェック
長時間ブロックするロックを避けながら、頻繁に使用される本番テーブルのディスク領域を回収する最も安全な方法は何ですか?
よくある質問
「VACUUM、autovacuum、vacuum_cost_delay」レッスンは無料ですか?
はい。「VACUUM、autovacuum、vacuum_cost_delay」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「VACUUM、autovacuum、vacuum_cost_delay」で何を学びますか?
大規模テーブルに向けて、autovacuumのしきい値、vacuum_cost_delay、並列VACUUMを調整します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「VACUUM、autovacuum、vacuum_cost_delay」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- MVCCと肥大化の原因
- VACUUM、autovacuum、vacuum_cost_delay
- ANALYZEとpg_statistic
- インデックスオンリースキャンとVisibility Map