PostgreSQL の VACUUM の動きを確認する

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 で、不要になったレコードの スペースを再利用可能にすることができます。

Google サイト内検索

Amazonアソシエイト