Dev Study
← データベースの仕組み
レッスン 4 / 13·約 9 分·第6期 データベースの仕組み

ディスクを空けるコマンドが、作業中に追加のディスクを要求する

リクエストがアプリケーションに届くまで
  1. ブラウザURL入力
  2. DNS名前→IP
  3. ルータ経路選択
  4. ロードバランサ振り分け
  5. Nginx受け口
  6. アプリ処理
  7. DB保存今ここ

前のレッスンで、通常の `VACUUM` は空間を回収するがOSには返さないことを見ました。今回はOSに返すもう一つの形を扱います。ロックの種類の網羅・WAL・インデックスはまだ扱っていません。

まず結論

`VACUUM FULL` は通常の `VACUUM` の「強い版」ではなく、**別物**です。公式は "There are two variants of `VACUUM`" と2つに分けた上で、`VACUUM FULL` は表の内容を**新しいファイルに書き直す**と説明します。だからOSに空間を返せます。

代償が2つあります。書き直す間は古い写しを残すため **"requires extra disk space"**——ディスクを空けるつもりのコマンドが、作業中に**追加のディスクを要求します**。さらに `ACCESS EXCLUSIVE` ロックを取り、公式の表では**これだけが素の `SELECT` を止めます**。公式自身が "strive to use standard `VACUUM` and avoid `VACUUM FULL`" と書いています。

? 読む前に予測

ディスクが残り少なくなったので `VACUUM FULL` で空間をOSに返そうとしています。実行中に起こることとして公式が明記しているのはどれですか。

当てることが目的ではありません。外した予測ほど記憶に残るので、直感で選んでください。

抽象原理

公式は「2つの変種」と書いている

前のレッスンで、通常の VACUUM は空間を回収するがOSには返さないことを見ました。ではOSに返す手段は無いのか——あります。ただし公式はそれを「強い版」とは呼びません。

There are two variants of VACUUM: standard VACUUM and VACUUM FULL. VACUUM FULL can reclaim more disk space but runs much more slowly.

two variants、2つの変種です。上位互換ではなく、並ぶ2つとして紹介されます。そして返せる理由は、やっていることがまるで違うからです。

VACUUM FULL rewrites the entire contents of the table into a new disk file with no extra space, allowing unused space to be returned to the operating system.

表の内容をすべて、隙間のない新しいファイルに書き直します。同じファイルの中を詰めるのではありません。新しく作って入れ替えるのです。だから使われていない空間がOSへ返ります。そして書き直す以上、遅くなります。

This form is much slower and requires an ACCESS EXCLUSIVE lock on each table while it is being processed.

ここまでで代償が2つ見えました。much slower であること、そして ACCESS EXCLUSIVE ロックを取ること。しかし本当に効くのは、まだ出てきていない3つ目です。

✓ ここまでの確認

`VACUUM FULL` がOSに空間を返せる理由を、公式の記述に最も近い形で述べているのはどれですか。

具体実物

ACCESS EXCLUSIVE は「Only」で説明される

ロックの名前だけでは重さが伝わりません。公式 explicit-locking の一文が、これを一発で位置づけます。

Only an ACCESS EXCLUSIVE lock blocks a SELECT (without FOR UPDATE/SHARE) statement.

Only です。多くのロックがある中で、これだけが素の SELECT を止めます。FOR UPDATE も FOR SHARE も付けない、ごく普通の読み取りが待たされます。

そして誰が取得するか。

Acquired by the DROP TABLE, TRUNCATE, REINDEX, CLUSTER, VACUUM FULL, and REFRESH MATERIALIZED VIEW (without CONCURRENTLY) commands.

ACCESS EXCLUSIVE を取得するコマンド(公式の一覧の順)表
DROP TABLE
TRUNCATE
REINDEX
CLUSTER
VACUUM FULL ← 掃除のつもりで打つ側
REFRESH MATERIALIZED VIEW (without CONCURRENTLY)

同じ列に並ぶのは DROP TABLE や TRUNCATE です。表を消すコマンドと同じ重さのロックを、掃除のつもりで打つコマンドが取ります。「掃除」という語感と、実際に止まる範囲が離れているのがここです。

具体実物

通常の VACUUM で「止まるもの」は定義の変更だけ

比べる相手を正確に押さえておきます。通常の VACUUM について、公式は何が止まらないかを括弧書きで並べます。

(Commands such as SELECT, INSERT, UPDATE, and DELETE will continue to function normally, though you will not be able to modify the definition of a table with commands such as ALTER TABLE while it is being vacuumed.)

読み書きの4つは continue to function normally。止まるのは ALTER TABLE のような定義の変更だけです。

一方 VACUUM FULL はこうです。

VACUUM FULL requires an ACCESS EXCLUSIVE lock on the table it is working on, and therefore cannot be done in parallel with other use of the table.

cannot be done in parallel with other use of the table ——その表の他の利用と並行できません。前のレッスンで見た "can operate in parallel with normal reading and writing of the table" と、正反対の文になっています。

✓ ここまでの確認

`VACUUM FULL` が取得する `ACCESS EXCLUSIVE` ロックの影響について、公式が明記していることはどれですか。

⇄ 2つを見比べる
具体例 A

通常の VACUUM — その場で印を付け替える

不要になった行の版を除き、空間を再利用可能と印を付けます。ファイルは作り直しません。だから追加の領域も要らず、排他ロックも取らないので "can operate in parallel with normal reading and writing of the table" です。代わりにOSへは、表の末尾でまるごと空いたページを切り詰められる場合を除いて返りません。

通常の VACUUM 実行中表
素のSELECT 通る
INSERT/UPDATE/DELETE 通る
ALTER TABLE 止まる
追加ディスク 要らない
OSへの返却 原則しない(末尾の空ページは例外)
具体例 B

VACUUM FULL — 作り直して入れ替える

隙間のない新しいファイルに全内容を書き直し、入れ替えます。だからOSに返せます。代わりに古い写しを完了まで抱えるので "requires extra disk space"、そして `ACCESS EXCLUSIVE` を取るので "cannot be done in parallel with other use of the table" です。

VACUUM FULL 実行中表
素のSELECT 止まる
INSERT/UPDATE/DELETE 止まる
ALTER TABLE 止まる
追加ディスク 要る(古い写しは完了まで残る)
OSへの返却 する

同じ「掃除」という名前の2つのコマンドが、要求する資源も止める範囲も逆になっています。この差はどこから生まれているでしょうか。

一方はファイルを作り直し、もう一方は作り直しません。そこから他のすべてが導かれます。

この章のまとめ

  • 公式は "two variants of VACUUM" と書く。VACUUM FULL は強い版ではなく別の変種。
  • OSに返せる理由は "rewrites the entire contents of the table into a new disk file with no extra space"——作り直して入れ替えるから。
  • 代償1: "requires extra disk space, since it writes a new copy of the table and doesn't release the old copy until the operation is complete"。空けるためのコマンドが作業中は消費を増やす。
  • 代償2: ACCESS EXCLUSIVE。"Only an ACCESS EXCLUSIVE lock blocks a SELECT (without FOR UPDATE/SHARE) statement." 素の SELECT まで止まる。取得する一覧に DROP TABLE TRUNCATE と並ぶ。
  • 通常の VACUUM で止まるのは ALTER TABLE のような定義の変更だけ。読み書きは "continue to function normally"。
  • 公式の結論は "strive to use standard VACUUM and avoid VACUUM FULL"。使うのは "only be used when a significant amount of space needs to be reclaimed from within the table" のとき。

自分の現場で確かめる

読んだだけでは身につきません。手元の環境で実際に見てみてください。

環境:

理解度チェック

読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。

問題 1 / 3正解: 0

「`VACUUM FULL` は通常の `VACUUM` を強くしたものだから、時間があるときはこちらを使うほうが良い」。この方針を公式の記述に照らして評価してください。

用語集(4語)
VACUUM FULL
公式の定義は "rewrites the entire contents of the table into a new disk file with no extra space, allowing unused space to be returned to the operating system"。"This form is much slower and requires an `ACCESS EXCLUSIVE` lock on each table while it is being processed."
two variants(2つの変種)
公式の言い方は "There are two variants of `VACUUM`: standard `VACUUM` and `VACUUM FULL`. `VACUUM FULL` can reclaim more disk space but runs much more slowly." 強弱ではなく**別の変種**として並べられている。
ACCESS EXCLUSIVE
公式の記述は "Only an `ACCESS EXCLUSIVE` lock blocks a `SELECT` (without `FOR UPDATE/SHARE`) statement." 取得するコマンドとして "the `DROP TABLE`, `TRUNCATE`, `REINDEX`, `CLUSTER`, `VACUUM FULL`, and `REFRESH MATERIALIZED VIEW` (without `CONCURRENTLY`) commands" が挙げられている。
extra disk space(追加のディスク領域)
`VACUUM FULL` が作業中に要求するもの。"This method also requires extra disk space, since it writes a new copy of the table and doesn't release the old copy until the operation is complete."