DBAtlas · データベース運用アトラス

空き領域を回収(shrink / vacuum / compact)

Oracle

ALTER TABLE customer ENABLE ROW MOVEMENT;
ALTER TABLE customer SHRINK SPACE;

SHRINK は高水位標(HWM)を下げる。インデックスも縮小するには SHRINK SPACE CASCADE を使用する。

PostgreSQL

-- Online, light locking (does not return space to the OS):
VACUUM (VERBOSE, ANALYZE) customer;
-- Return space to the OS (locks the table!):
-- VACUUM FULL customer;

VACUUM FULL は AccessExclusiveLock を取得してテーブルを書き直す。ピーク時間帯には実行しないこと。代替手段: pg_repack。

MySQL

OPTIMIZE TABLE customer;

InnoDB ではテーブルを再構築して data_free の領域を返却する。大きなテーブルでは長時間かかる。

SQL Server

-- Generally NOT RECOMMENDED (causes fragmentation). If really needed:
DBCC SHRINKFILE (N'MyDB_data', 1024);  -- target 1024 MB

データファイルの縮小はインデックスの断片化を引き起こす。その後にインデックスを REBUILD する。ログの場合は先にバックアップを取得する。

MongoDB

db.runCommand({ compact: "customer" })

WiredTiger では空き領域を OS に返却しようとする(常に可能とは限らない)。4.4+ では読み取り/書き込みはブロックせず、同じコレクションに対する一部の DDL 操作のみをブロックする。IO 負荷が高いため、セカンダリ上でメンテナンスウィンドウに実行するほうが安全。

Redis

MEMORY PURGE
# Tries to return jemalloc fragmentation to the OS

activedefrag yes の設定でオンラインの自動デフラグが行われる。MEMORY DOCTOR は推奨事項を示す。

DBAtlas で開く →