vib*_*blo 9 postgresql disk-space ddl vacuum postgresql-9.3
我在 PostgreSQL 数据库中有一个大量使用的表(大约有 500 万行),我想在其中删除一列并回收该列使用的空间。
文档建议进行表重写ALTER TABLE
以强制返回空间,但这在使用表时运行并不安全,并且会导致停机。是否有任何不需要停机的实用选项?我试图运行该pgcompact
工具,但这并没有改变任何东西。
Erw*_*ter 12
ALTER TABLE .. DROP COLUMN ...
在系统表中将该列标记为已删除pg_attribute
。在以某种方式重写行之前,不会以其他方式操纵表本身。下降本身非常快,但确实需要短暂ACCESS EXCLUSIVE
锁定。不过,我不会称之为“停机时间”。
实际上回收磁盘空间是棘手的部分。您可以使用社区工具pg_repack
代替VACUUM FULL
or CLUSTER
(以独占方式锁定表)。它避免了排他锁,但它需要磁盘上的可用空间才能操作。更多细节:
或者,如果您的表中的行最终更新,您可以等待它。每个新行版本都将删除的列设置为 NULL。当旧行版本被您覆盖或删除时,VACUUM
您基本上会重新获得空间。但是,一些极端情况例外适用。看: