- ブラウザURL入力
- DNS名前→IP
- ルータ経路選択
- ロードバランサ振り分け
- Nginx受け口
- アプリ処理
- 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: standardVACUUMandVACUUM FULL.VACUUM FULLcan reclaim more disk space but runs much more slowly.
two variants、2つの変種です。上位互換ではなく、並ぶ2つとして紹介されます。そして返せる理由は、やっていることがまるで違うからです。
VACUUM FULLrewrites 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 EXCLUSIVElock 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 EXCLUSIVElock blocks aSELECT(withoutFOR UPDATE/SHARE) statement.
Only です。多くのロックがある中で、これだけが素の SELECT を止めます。FOR UPDATE も FOR SHARE も付けない、ごく普通の読み取りが待たされます。
そして誰が取得するか。
Acquired by the
DROP TABLE,TRUNCATE,REINDEX,CLUSTER,VACUUM FULL, andREFRESH MATERIALIZED VIEW(withoutCONCURRENTLY) commands.
DROP TABLETRUNCATEREINDEXCLUSTERVACUUM FULL ← 掃除のつもりで打つ側REFRESH MATERIALIZED VIEW (without CONCURRENTLY)
同じ列に並ぶのは DROP TABLE や TRUNCATE です。表を消すコマンドと同じ重さのロックを、掃除のつもりで打つコマンドが取ります。「掃除」という語感と、実際に止まる範囲が離れているのがここです。
通常の VACUUM で「止まるもの」は定義の変更だけ
比べる相手を正確に押さえておきます。通常の VACUUM について、公式は何が止まらないかを括弧書きで並べます。
(Commands such as
SELECT,INSERT,UPDATE, andDELETEwill continue to function normally, though you will not be able to modify the definition of a table with commands such asALTER TABLEwhile it is being vacuumed.)
読み書きの4つは continue to function normally。止まるのは ALTER TABLE のような定義の変更だけです。
一方 VACUUM FULL はこうです。
VACUUM FULLrequires anACCESS EXCLUSIVElock 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` ロックの影響について、公式が明記していることはどれですか。
通常の VACUUM — その場で印を付け替える
不要になった行の版を除き、空間を再利用可能と印を付けます。ファイルは作り直しません。だから追加の領域も要らず、排他ロックも取らないので "can operate in parallel with normal reading and writing of the table" です。代わりにOSへは、表の末尾でまるごと空いたページを切り詰められる場合を除いて返りません。
素のSELECT 通るINSERT/UPDATE/DELETE 通るALTER TABLE 止まる追加ディスク 要らないOSへの返却 原則しない(末尾の空ページは例外)
VACUUM FULL — 作り直して入れ替える
隙間のない新しいファイルに全内容を書き直し、入れ替えます。だからOSに返せます。代わりに古い写しを完了まで抱えるので "requires extra disk space"、そして `ACCESS EXCLUSIVE` を取るので "cannot be done in parallel with other use of the table" です。
素の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 anACCESS EXCLUSIVElock blocks aSELECT(withoutFOR UPDATE/SHARE) statement." 素のSELECTまで止まる。取得する一覧にDROP TABLETRUNCATEと並ぶ。 - 通常の
VACUUMで止まるのはALTER TABLEのような定義の変更だけ。読み書きは "continue to function normally"。 - 公式の結論は "strive to use standard
VACUUMand avoidVACUUM FULL"。使うのは "only be used when a significant amount of space needs to be reclaimed from within the table" のとき。
自分の現場で確かめる
読んだだけでは身につきません。手元の環境で実際に見てみてください。
理解度チェック
読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。
「`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."