【PostgreSQL】VACUUMとは、VACUUM FULLの実行

PostgreSQL構文

VACUUM(バキューム)とは

PostgreSQLはデータを消しても実際には消えてはなく、削除フラグがついていて見えなくなっているだけの状態になっています。この削除データは定期的にきれいにする必要があり、この処理をVACUUMといいます。

昔のバージョンでは、このVACUUM処理は手動で行う必要がありましたが、現在、このVACUUM処理を自動で行う機能(AUTOVACUUM)がデフォルトでONになっています。

 

 

VACUUMとVACUUM FULL

VACUUMには通常のVACUUMと、VACUUM FULLの2つがあります。

(加えてVACUUM ANALYZEがありますがそれは後述します)

 

通常のVACUUMは、きれいにした領域をOSに返さない(=サイズは変わらない)かわりに処理は早く、VACUUM FULLでは、きれいにした領域をOSに返しますが処理は遅くなっています

 

また通常のVACUUMの場合、排他的ロックを取得しないため、テーブルへの通常の読み書き操作と並行して実行することができます。一方VACUUM FULLでは、排他的ロックが必要になります。

 

 

VACUUM

VACUUMをするコマンドは次のとおりです。 ※pgAdminのクエリツールからも実行できます。

-- テーブル名を指定してVACUUMする
VACUUM テーブル名;

-- VERBOSEオプションをつけると、実行時間等の詳細情報が表示されます
VACUUM VERBOSE テーブル名;

-- テーブル名を省略すると、すべてのテーブルを対象とします
VACUUM;

 

 

VACUUM FULL

VACUUM FULLのコマンドは次のとおりです。

-- 通常のVACUUM ※テーブル名を省略すると、すべてのテーブルを対象とします
VACUUM テーブル名;

-- FULLオプションあり
VACUUM FULL テーブル名;

 

 

VACUUM ANALYZE

VACUUM ANALYZEは、VACUUM後にANALYZEを実行します。

ANALYZEとは、データベース内のテーブルの内容に関する統計情報を更新するコマンドです。

-- VACUUM+ANALYZEをする ※テーブル名を省略すると、すべてのテーブルを対象とします
VACUUM ANALYZE テーブル名;

-- すべてのテーブル指定では、時間がかかるので注意
VACUUM ANALYZE;

 

 

 

テーブルの最終VACUUM時間を確認する

次のselect文でvacuumの実行時間を確認できます。

select relname 
, last_vacuum , last_autovacuum
from pg_stat_all_tables order by relname;