カテゴリ: データベース 更新日: 2026/04/13

PostgreSQLのパフォーマンス改善!初心者向けAUTOVACUUM(オートバキューム)設定ガイド

PostgreSQLのAUTOVACUUMの動作と設定の考え方
PostgreSQLのAUTOVACUUMの動作と設定の考え方

先生と生徒の会話形式で理解しよう

生徒

「データベースを使っていると、だんだん動作が重くなるって聞いたんですけど、本当ですか?」

先生

「はい、本当です。特にPostgreSQL(ポストグレスキューエル)というデータベースでは、データの消しゴムのカスのようなものが溜まってしまう性質があるんですよ。」

生徒

「消しゴムのカス?放っておくとどうなるんですか?」

先生

「お部屋の掃除をしないと、ゴミで足の踏み場がなくなって動きにくくなりますよね。データベースも同じで、自動でお掃除してくれる『AUTOVACUUM(オートバキューム)』という機能が重要なんです。」

1. PostgreSQLの「お掃除」が必要な理由とは?

1. PostgreSQLの「お掃除」が必要な理由とは?
1. PostgreSQLの「お掃除」が必要な理由とは?

パソコンを触ったことがない方にとって、「データベースの掃除」と言われてもピンとこないかもしれません。 実は、PostgreSQLというデータベースには、「データを更新したり削除したりしても、古いデータがその場に残り続ける」という独特の仕組みがあります。

これを専門用語で「MVCC(多版同時実行制御)」と呼びますが、簡単に言えば「上書き保存」ではなく「古いページは残したまま、新しいページを作る」というイメージです。 例えば、名簿の住所を書き換えたとき、古い住所に×印をつけて、横に新しい住所を書き足すようなものです。

この「×印がついた古いデータ」のことを「不要領域(デッドタプル)」と呼びます。 これが増えすぎると、本棚に古い新聞が山積みになって新しい本が入らなくなるように、データベースの動作が極端に遅くなってしまいます。

エンジニアの必須スキル「SQL」を、 図解と豊富な練習問題でゼロから体系的に学びたい人へ。 MySQLやPostgreSQLなど、各種データベースに対応した不朽の入門書です。

SQL 第2版 ゼロからはじめるデータベース操作をAmazonで見る

※ Amazon広告リンク

2. AUTOVACUUM(オートバキューム)は全自動お掃除ロボット

2. AUTOVACUUM(オートバキューム)は全自動お掃除ロボット
2. AUTOVACUUM(オートバキューム)は全自動お掃除ロボット

この溜まったゴミを片付けて、空いたスペースを再び使えるように整理整頓する作業を「VACUUM(バキューム)」と言います。 昔は人間が手動で命令を出して掃除をしていましたが、今は「AUTOVACUUM(オートバキューム)」という機能が、全自動お掃除ロボットのように裏側でこっそり掃除をしてくれます。

この機能のおかげで、私たちは意識しなくてもデータベースを快適に使い続けることができます。 しかし、設定が適切でないと「掃除が追いつかない」または「掃除ばかりしていて本来の仕事が遅くなる」といった問題が起こります。

3. 実際にデータがどう動くか見てみよう

3. 実際にデータがどう動くか見てみよう
3. 実際にデータがどう動くか見てみよう

まずは、掃除が必要になる前の綺麗な状態のテーブル(表)を見てみましょう。 以下は、会員のポイントを管理する「users」というテーブルです。


id | name     | points | status
---+----------+--------+--------
1  | 田中さん | 100    | active
2  | 鈴木さん | 200    | active
3  | 佐藤さん | 50     | active
4  | 伊藤さん | 0      | inactive

ここで、伊藤さんのデータを削除し、田中さんのポイントを更新してみます。


-- 伊藤さんを削除する
DELETE FROM users WHERE name = '伊藤さん';

-- 田中さんのポイントを増やす
UPDATE users SET points = 150 WHERE name = '田中さん';

一見、データは綺麗に書き換わったように見えます。


id | name     | points | status
---+----------+--------+--------
1  | 田中さん | 150    | active
2  | 鈴木さん | 200    | active
3  | 佐藤さん | 50     | active

しかし、データベースの内部(裏側)では、削除された「伊藤さん」のデータや、更新前の「田中さんの100ポイント」というデータが、透明なゴミとして残っています。 これが積み重なると、パフォーマンスの低下(動作が重くなること)を招きます。

4. AUTOVACUUMの主要な設定値を知る

4. AUTOVACUUMの主要な設定値を知る
4. AUTOVACUUMの主要な設定値を知る

お掃除ロボットをどのタイミングで動かすかを決める設定がいくつかあります。 初心者の方でも、これだけは知っておきたい重要な設定項目を3つ紹介します。

① autovacuum_vacuum_threshold(お掃除開始の最低ライン)

「ゴミが何個溜まったら掃除を始めるか」という基本の数です。初期設定では通常50個です。

② autovacuum_vacuum_scale_factor(ゴミの割合)

「全体のデータの何%がゴミになったら掃除を始めるか」という割合です。 例えばこれが0.2なら、20%のデータが書き換わったり消されたりした時に掃除が始まります。

③ autovacuum_naptime(見回りの頻度)

「お掃除ロボットが、掃除が必要な場所がないか確認しに行く間隔」です。 1分(1min)に設定されていることが多いです。

5. チューニング(設定調整)の考え方

5. チューニング(設定調整)の考え方
5. チューニング(設定調整)の考え方

「チューニング」とは、楽器の音を合わせるように、データベースの設定を最適な状態に調整することです。 基本的には、以下の2つのパターンで考えます。

データ量が多い場合

100万件もデータがある場合、20%がゴミになるまで待つと、20万件分もゴミが溜まることになります。 これでは掃除が大変すぎて、一度始まるとパソコンに大きな負担がかかってしまいます。 この場合は、割合(scale_factor)を小さくして、こまめに掃除をさせるのがコツです。

更新が激しい場合

一秒間に何度もデータを書き換えるようなシステムでは、お掃除ロボットが休む暇もありません。 あまりに頻繁に掃除をさせると、逆に本来の処理が遅くなってしまいます。 そのため、掃除のスピードを少し抑えたり、並行して動くロボットの数(autovacuum_max_workers)を調整したりします。

6. 実際に設定を確認・変更する命令

6. 実際に設定を確認・変更する命令
6. 実際に設定を確認・変更する命令

プログラミングをやったことがなくても、コマンド一発で今の設定を確認することができます。 例えば、現在のお掃除設定を確認するには以下のような命令を使います。


-- AUTOVACUUMが有効になっているか確認する
SELECT name, setting 
FROM pg_settings 
WHERE name = 'autovacuum';

実行結果は以下のようになります。


name        | setting
------------+---------
autovacuum  | on

「on」になっていれば、お掃除ロボットは元気に働いています。 もしこれが「off」になっていたら、家中がゴミ屋敷になってしまうので、必ず「on」にしておきましょう。

7. 掃除ができないと発生する「膨張(Bloat)」問題

7. 掃除ができないと発生する「膨張(Bloat)」問題
7. 掃除ができないと発生する「膨張(Bloat)」問題

掃除が追いつかないと、データが「肥大化(ひだいか)」します。 これを英語で「Bloat(ブロート)」と言います。 風船が膨らむように、実際のデータ量は少ないのに、データベースのファイルサイズだけが巨大になってしまう現象です。

一度膨らんでしまったファイルは、普通の掃除(VACUUM)では小さくなりません。 これを元に戻すには、家を一度壊して建て直すような、もっと強力で大変な作業「VACUUM FULL(バキューム・フル)」が必要になります。 しかし、この作業中はデータベースが全く使えなくなってしまうという大きな欠点があります。

そうならないためにも、日頃から「AUTOVACUUM」の設定を適切に保ち、こまめにお掃除を完結させることが、安定したシステム運用の秘訣なのです。

8. 統計情報の更新(ANALYZE)もセットで行う

8. 統計情報の更新(ANALYZE)もセットで行う
8. 統計情報の更新(ANALYZE)もセットで行う

実はAUTOVACUUMは掃除だけでなく、「ANALYZE(アナライズ)」という大切な仕事も一緒にこなしています。 これは、「どのデータがどこにあるか」という最新の地図を作成する作業です。

データベースは、データを探すときにこの地図を見て「一番早いルート」を考えます。 地図が古いと、近道があるのに遠回りをしてしまい、結果として検索が遅くなります。 AUTOVACUUMは、掃除のついでにこの地図も新しく書き換えてくれる、とても気が利く存在なのです。


-- 手動で地図を更新する命令(普段は自動でやってくれます)
ANALYZE users;

お掃除(VACUUM)と地図作り(ANALYZE)は、いわば車の両輪のようなものです。 この2つがバランスよく行われることで、PostgreSQLは最高のパフォーマンスを発揮します。

カテゴリの一覧へ
新着記事
New1
Ruby
Rubyのjoinと配列変換を完全解説!文字列⇔配列の相互変換レシピ集
New2
Ruby
Rubyの正規表現高度テクニック!名前付きキャプチャ・後方参照・先読み/後読み
New3
Ruby
RubyのStringの特徴を完全ガイド!初心者でもわかる可変オブジェクト・エンコーディング・freezeの効果
New4
Ruby
Rubyのハッシュ(Hash)の使い方を完全ガイド!初心者でもわかるシンボル・デフォルト値・dig活用
人気記事
No.1
Java&Spring記事人気No1
Ruby
WindowsでRubyをインストールする方法!RubyInstallerとMSYS2を使った完全ガイド
No.2
Java&Spring記事人気No2
データベース
PostgreSQLのCTE(WITH句)完全解説!複雑なSQLを整理して読みやすくする書き方
No.3
Java&Spring記事人気No3
Ruby
PATHと環境変数の正しい設定!Windows・Mac・Linux別チェックリスト付き
No.4
Java&Spring記事人気No4
Rails
Rails本番運用入門:環境設計・ステージング・本番をゼロから理解するロードマップ
No.5
Java&Spring記事人気No5
Ruby
Rubyの始め方ガイド:インストールから最初のHello Worldまで(Windows/Mac/Linux)
No.6
Java&Spring記事人気No6
データベース
PostgreSQLのデータ型を完全解説!初心者でも失敗しないデータベース入門
No.7
Java&Spring記事人気No7
Ruby
VS Codeで快適Ruby開発!拡張機能・デバッグ・Lint/Format自動化ガイド
No.8
Java&Spring記事人気No8
データベース
SQLで複数テーブルを結合する方法を徹底解説!初心者でも図解でわかるJOINと集計の基本