OSにスペースを戻すには、を使用しますVACUUM FULL
。その間、あなたは走ると思いますVACUUM FULL ANALYZE
。私はマニュアルを引用します:
FULL
「フル」バキュームを選択します。これにより、より多くのスペースを再利用できますが、時間がかかり、テーブルが排他的にロックされます。この方法では、テーブルの新しいコピーを書き込み、操作が完了するまで古いコピーを解放しないため、追加のディスク領域も必要です。通常、これは、テーブル内から大量のスペースを再利用する必要がある場合にのみ使用してください。
大胆な強調鉱山。
CLUSTER
副次的効果としてもそれを達成します。
VACUUM
通常、Plain は目標を達成しません(「テーブルの最後にある1つ以上のページが完全に無料」)。行を並べ替えることはせず、機会が生じたときにファイルの物理的な終わりから空のページをプルーニングするだけです-マニュアルからの引用のように。
他のタプルが追加される前INSERT
に行とバッチのバッチを作成すると、物理ファイルの最後に空のページをDELETE
取得できます。または、十分な行が削除された場合、偶然に発生する可能性があります。
VACUUM FULL
スペースの再利用を妨げる可能性のある特別な設定もあります。見る:
テスト用に表の最後に空のページを準備します
システム列ctid
は、行の物理的な位置を表します。その列を理解する必要があります:
それを使って、最後のページからすべての行を削除してテーブルを準備できます。
DELETE FROM tbl t
USING (
SELECT (split_part(ctid::text, ',', 1) || ',0)')::tid AS min_tid
, (split_part(ctid::text, ',', 1) || ',65535)')::tid AS max_tid
FROM tbl
ORDER BY ctid DESC
LIMIT 1
) d
WHERE t.ctid BETWEEN d.min_tid AND d.max_tid;
現在、最後のページは空です。これは同時書き込みを無視します。そのテーブルに書き込みを行うのは自分だけであるか、干渉を避けるために書き込みロックを取得する必要があります。
クエリは、適格な行をすばやく識別するために最適化されます。aの2番目の数値は、tid
unsignedとして格納されているタプルインデックスint2
であり65535
、そのタイプの最大値(2^16 - 1
)であるため、これが安全な上限です。
SQL Fiddle(異なるケースの単純なテーブルを再利用します。)
行/テーブルのサイズを測定するツール:
ディスクがいっぱいです
これらの操作のいずれかを行うには、ディスク上にウィグルルームが必要です。/のpg_repack
代わりとしてのコミュニティツールもあります。排他ロックを回避しますが、同様に機能するために空き領域が必要です。マニュアル:VACUUM FULL
CLUSTER
ターゲットテーブルとインデックスの2倍の空きディスク領域が必要です。
最後の手段として、ダンプ/復元サイクルを実行できます。これにより、テーブルとインデックスからすべての膨張も削除されます。密接に関連した質問:
向こうの答えはかなり急進的です。状況が許す場合(外部キーや行の削除を妨げる他の参照がなく、テーブルへの同時アクセスがない場合)、次のことができます。
接続ディスクへのテーブルダンプリモートコンピュータとディスクスペースの多くを(-a
用--data-only
):
リモートシェルから、テーブルデータをダンプします。
pg_dump -h <host_name> -p <port> -t mytbl -a mydb > db_mytbl.sql
pgセッションでTRUNCATE
は、テーブルは次のようになります。
-- drop all indexes and constraints here for best performance
TRUNCATE mytbl;
リモートシェルから、同じテーブルに復元します。
psql -h <host_name> -p <port> mydb -f db_mytbl.sql
-- recreate all indexes and constraints here
現在、デッド行や膨張はありません。
しかし、おそらくあなたはそれをよりシンプルにすることができますか?
無関係なファイルを削除(移動)して、ディスクに十分なスペースを確保できますか?
VACUUM FULL
テーブルを1つずつ小さくして、十分なディスク領域を解放できますか?
肥大化したインデックスからディスク領域を実行REINDEX TABLE
またはREINDEX INDEX
解放できますか?
あなたが何をするにしても、発疹にならないでください。疑わしい場合は、最初にすべてを安全な場所にバックアップしてください。