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