読者です 読者をやめる 読者になる 読者になる

drop columnしたのにディスク容量が減らない件

postgresql

PostgreSQL8.2.0文書より

DROP COLUMN構文は、列を物理的には削除せず、SQLを操作する上で不可視にします。 このコマンドを実行した後、テーブルに挿入または更新が行われると、削除した列にはNULLが格納されます。 したがって、列の削除は短時間で行えます。しかし、削除された列が占めていた領域がまだ回収されていないため、テーブルのディスク上のサイズはすぐには小さくなりません。 この領域は、その後既存の行が更新されるタイミングで回収されます。

ALTER TYPEがテーブル全体の書き換えを必要とすることが利点になる場合もあります。書き換え処理によって、テーブル内の不要となった領域が除去されるからです。例えば、削除した列が使用していた領域を即座に回収したい場合、最も高速なコマンドは次のようになります。

ALTER TABLE table ALTER COLUMN anycol TYPE anytype;

ここでanycolには既存のテーブル列を、anytypeには既存の列と同一の型を指定します。このコマンドを実行すると、見た目にはテーブルに有意な変更はありませんが、不要となったデータを取り除く強制的な書き換えが行われます。

へぇ〜〜〜〜…
これだ!