PostgreSQLのパフォーマンス改善!初心者向けAUTOVACUUM(オートバキューム)設定ガイド
生徒
「データベースを使っていると、だんだん動作が重くなるって聞いたんですけど、本当ですか?」
先生
「はい、本当です。特にPostgreSQL(ポストグレスキューエル)というデータベースでは、データの消しゴムのカスのようなものが溜まってしまう性質があるんですよ。」
生徒
「消しゴムのカス?放っておくとどうなるんですか?」
先生
「お部屋の掃除をしないと、ゴミで足の踏み場がなくなって動きにくくなりますよね。データベースも同じで、自動でお掃除してくれる『AUTOVACUUM(オートバキューム)』という機能が重要なんです。」
1. PostgreSQLの「お掃除」が必要な理由とは?
パソコンを触ったことがない方にとって、「データベースの掃除」と言われてもピンとこないかもしれません。 実は、PostgreSQLというデータベースには、「データを更新したり削除したりしても、古いデータがその場に残り続ける」という独特の仕組みがあります。
これを専門用語で「MVCC(多版同時実行制御)」と呼びますが、簡単に言えば「上書き保存」ではなく「古いページは残したまま、新しいページを作る」というイメージです。 例えば、名簿の住所を書き換えたとき、古い住所に×印をつけて、横に新しい住所を書き足すようなものです。
この「×印がついた古いデータ」のことを「不要領域(デッドタプル)」と呼びます。 これが増えすぎると、本棚に古い新聞が山積みになって新しい本が入らなくなるように、データベースの動作が極端に遅くなってしまいます。
エンジニアの必須スキル「SQL」を、 図解と豊富な練習問題でゼロから体系的に学びたい人へ。 MySQLやPostgreSQLなど、各種データベースに対応した不朽の入門書です。
SQL 第2版 ゼロからはじめるデータベース操作をAmazonで見る※ Amazon広告リンク
2. AUTOVACUUM(オートバキューム)は全自動お掃除ロボット
この溜まったゴミを片付けて、空いたスペースを再び使えるように整理整頓する作業を「VACUUM(バキューム)」と言います。 昔は人間が手動で命令を出して掃除をしていましたが、今は「AUTOVACUUM(オートバキューム)」という機能が、全自動お掃除ロボットのように裏側でこっそり掃除をしてくれます。
この機能のおかげで、私たちは意識しなくてもデータベースを快適に使い続けることができます。 しかし、設定が適切でないと「掃除が追いつかない」または「掃除ばかりしていて本来の仕事が遅くなる」といった問題が起こります。
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の主要な設定値を知る
お掃除ロボットをどのタイミングで動かすかを決める設定がいくつかあります。 初心者の方でも、これだけは知っておきたい重要な設定項目を3つ紹介します。
① autovacuum_vacuum_threshold(お掃除開始の最低ライン)
「ゴミが何個溜まったら掃除を始めるか」という基本の数です。初期設定では通常50個です。
② autovacuum_vacuum_scale_factor(ゴミの割合)
「全体のデータの何%がゴミになったら掃除を始めるか」という割合です。 例えばこれが0.2なら、20%のデータが書き換わったり消されたりした時に掃除が始まります。
③ autovacuum_naptime(見回りの頻度)
「お掃除ロボットが、掃除が必要な場所がないか確認しに行く間隔」です。 1分(1min)に設定されていることが多いです。
5. チューニング(設定調整)の考え方
「チューニング」とは、楽器の音を合わせるように、データベースの設定を最適な状態に調整することです。 基本的には、以下の2つのパターンで考えます。
データ量が多い場合
100万件もデータがある場合、20%がゴミになるまで待つと、20万件分もゴミが溜まることになります。 これでは掃除が大変すぎて、一度始まるとパソコンに大きな負担がかかってしまいます。 この場合は、割合(scale_factor)を小さくして、こまめに掃除をさせるのがコツです。
更新が激しい場合
一秒間に何度もデータを書き換えるようなシステムでは、お掃除ロボットが休む暇もありません。 あまりに頻繁に掃除をさせると、逆に本来の処理が遅くなってしまいます。 そのため、掃除のスピードを少し抑えたり、並行して動くロボットの数(autovacuum_max_workers)を調整したりします。
6. 実際に設定を確認・変更する命令
プログラミングをやったことがなくても、コマンド一発で今の設定を確認することができます。 例えば、現在のお掃除設定を確認するには以下のような命令を使います。
-- AUTOVACUUMが有効になっているか確認する
SELECT name, setting
FROM pg_settings
WHERE name = 'autovacuum';
実行結果は以下のようになります。
name | setting
------------+---------
autovacuum | on
「on」になっていれば、お掃除ロボットは元気に働いています。 もしこれが「off」になっていたら、家中がゴミ屋敷になってしまうので、必ず「on」にしておきましょう。
7. 掃除ができないと発生する「膨張(Bloat)」問題
掃除が追いつかないと、データが「肥大化(ひだいか)」します。 これを英語で「Bloat(ブロート)」と言います。 風船が膨らむように、実際のデータ量は少ないのに、データベースのファイルサイズだけが巨大になってしまう現象です。
一度膨らんでしまったファイルは、普通の掃除(VACUUM)では小さくなりません。 これを元に戻すには、家を一度壊して建て直すような、もっと強力で大変な作業「VACUUM FULL(バキューム・フル)」が必要になります。 しかし、この作業中はデータベースが全く使えなくなってしまうという大きな欠点があります。
そうならないためにも、日頃から「AUTOVACUUM」の設定を適切に保ち、こまめにお掃除を完結させることが、安定したシステム運用の秘訣なのです。
8. 統計情報の更新(ANALYZE)もセットで行う
実はAUTOVACUUMは掃除だけでなく、「ANALYZE(アナライズ)」という大切な仕事も一緒にこなしています。 これは、「どのデータがどこにあるか」という最新の地図を作成する作業です。
データベースは、データを探すときにこの地図を見て「一番早いルート」を考えます。 地図が古いと、近道があるのに遠回りをしてしまい、結果として検索が遅くなります。 AUTOVACUUMは、掃除のついでにこの地図も新しく書き換えてくれる、とても気が利く存在なのです。
-- 手動で地図を更新する命令(普段は自動でやってくれます)
ANALYZE users;
お掃除(VACUUM)と地図作り(ANALYZE)は、いわば車の両輪のようなものです。 この2つがバランスよく行われることで、PostgreSQLは最高のパフォーマンスを発揮します。