PostgreSQL は データを更新したときや 削除したときに レコードに「不要」マークを付けるという処理を行ないます。
「不要」マークの付いたレコード(以下、不要なレコード)は そのままでは再利用できないのでデータを挿入しなくても 更新を繰り返すだけで テーブルの使用するスペースは広がっていきます。
VACUUM は、不要になったレコードのスペースを 再利用可能にします。 今回は、その動きを確認してみたいと思います。
まずは新しくテーブル vacuum_test を作成します。
db=# CREATE TABLE vacuum_test (f1 VARCHAR(10), f2 INTEGER);
CREATE TABLE
情報は pg_stat_all_tables カタログから取得します。
db=# SELECT n_live_tup,n_dead_tup,last_vacuum,last_autovacuum db-# FROM pg_stat_all_tables db-# WHERE relname = 'vacuum_test'; -[ RECORD 1 ]----+------------ n_live_tup | 0 n_dead_tup | 0 last_vacuum | last_autovacuum |
テーブルを作成した時点では上のようになっています。
VACUUM に関連する主な列のみ取得しています。
それぞれの列の意味は次のようになります。
列名 | 説明 |
---|---|
n_live_tup | 有効なレコード数 |
n_dead_tup | 不要になったレコード数 |
last_vacuum | 最後に VACUUM を実行した時刻 |
last_autovacuum | 最後に 自動 VACUUM が実行された時刻 |
レコードを挿入します。
INSERT INTO vacuum_test VALUES ('00001', 10); INSERT INTO vacuum_test VALUES ('00002', 20); INSERT INTO vacuum_test VALUES ('00003', 30); INSERT INTO vacuum_test VALUES ('00004', 40); INSERT INTO vacuum_test VALUES ('00005', 50);
状態を確認します。
db=# SELECT n_live_tup,n_dead_tup,last_vacuum,last_autovacuum db-# FROM pg_stat_all_tables db-# WHERE relname = 'vacuum_test'; -[ RECORD 1 ]----+------------ n_live_tup | 5 n_dead_tup | 0 last_vacuum | last_autovacuum |
5 レコード挿入したので、有効なレコード数が 5 になりました。
次に 1 レコード削除します。
db=# DELETE FROM vacuum_test WHERE f1 = '00002';
DELETE 1
状態を確認します。
db=# SELECT n_live_tup,n_dead_tup,last_vacuum,last_autovacuum db-# FROM pg_stat_all_tables db-# WHERE relname = 'vacuum_test'; -[ RECORD 1 ]----+------------ n_live_tup | 4 n_dead_tup | 1 last_vacuum | last_autovacuum |
有効なレコード数が 4 になり 不要なレコード数が 1 になりました。
ついでに更新もします。
db=# UPDATE vacuum_test SET f2 = 15 WHERE f1 = '00001';
UPDATE 1
しつこく状態を確認します。
db=# SELECT n_live_tup,n_dead_tup,last_vacuum,last_autovacuum db-# FROM pg_stat_all_tables db-# WHERE relname = 'vacuum_test'; -[ RECORD 1 ]----+------------ n_live_tup | 4 n_dead_tup | 2 last_vacuum | last_autovacuum |
不要なレコード数が 1 増えました。
ここまでは準備です。 ようやく VACUUM を実行します。
db=# VACUUM vacuum_test;
VACUUM
状態を確認します。
db=# SELECT n_live_tup,n_dead_tup,last_vacuum,last_autovacuum db-# FROM pg_stat_all_tables db-# WHERE relname = 'vacuum_test'; -[ RECORD 1 ]----+------------------------------ n_live_tup | 4 n_dead_tup | 0 last_vacuum | 2010-04-20 22:20:20.560647+09 last_autovacuum |
不要なレコード数が 0 になりました。
last_vacuum に VACUUM を実行した時刻が入っています。
このように VACUUM で、不要になったレコードの スペースを再利用可能にすることができます。