簡単に言うと、データベースストレージはスペースよりも速度が最適化されています。
たとえば、テーブルに100行を挿入し、奇数のIDを持つすべての行を削除した場合、DBMSは50行のみの新しいテーブルを書き出すことができますが、削除された行を単に空き領域としてマークする方が効率的です。次に行を挿入するときにそれらを再利用します。したがって、テーブルは現在必要なスペースの2倍のスペースを占有します。
Postgresがトランザクション管理にロックではなく「MVCC」を使用すると、これがさらに起こりやすくなります。これは、UPDATEでは通常、新しい行をストレージに書き込み、トランザクションがそれを参照しなくなったら古い行を削除済みとしてマークするためです。
データベースをダンプして復元することにより、この空き領域がまったくないDBを再作成することになります。これは基本的にVACUUM FULL
です。 コマンドは実行します-現在のデータを新しいファイルに書き換えてから、古いファイルを削除します。
pg_freespace
と呼ばれるPostgresで配布される
Select oid::regclass::varchar as table,
pg_size_pretty(pg_relation_size(oid)/1024 * 1024) As size,
pg_size_pretty(sum(free)) As free
From (
Select c.oid,
(pg_freespace(c.oid)).avail As free
From pg_class c
Join pg_namespace n on n.oid = c.relnamespace
Where c.relkind = 'r'
And n.nspname Not In ('information_schema', 'pg_catalog')
) tbl
Group By oid
Order By pg_relation_size(oid) Desc, sum(free) Desc;