有没有办法在不将磁盘大小加倍的情况下向 Postgresql 表添加非空类型列?例如,如果我有一个定义了一些列的表,并且我想添加一个列,我会执行以下操作:
alter table my_table add new_column int
update table my_table set new_column = 0
alter table my_table alter column new_column set not null
由于 Postgresql 的工作方式,这实际上使为表分配的空间增加了一倍。更新正在创建新的元组,这些元组将在此事务完成并且真空完成其工作后被标记为重用。如果表的大小很大(即几百万行)但增长非常缓慢或大小几乎恒定,则这些行将永远不会被重用,并且只有“真空完全”或完全数据库备份和恢复会回收磁盘上的空间。有没有办法自动添加具有某些默认值但没有这种行为的列?例如,如果有一种方法可以锁定表并进行更新,那么在这种情况下就不需要 MVCC。