ALTER TABLE在有限的磁盘空间上添加新列

时间:2015-11-17 23:08:34

标签: postgresql alter-table

我有一个关于操作主表的问题:我需要在其中添加一个新列,但是已经有超过5000万个条目需要更新。
如果我没有将数据存储在数据库已经填充了一半以上的小ssd上,那就像alter table一样容易。
alter table无法完成,因为它创建了表的副本,然后才替换原始表。

两个副本无法放在我的ssd驱动器上,所以可以直接在原始表上操作,还是使用另一个驱动器作为临时表? 或者我应该使用另一台计算机在更大的驱动器上更改我的表,然后只转移回我的ssd服务器?

提前致谢!

PS:时间不是真正的问题,它是一个几乎没有用户的非实时系统,因此我被允许将所有内容删除几个小时(感谢网络神!)

2 个答案:

答案 0 :(得分:2)

如果列没有ADD COLUMN且无效,则PostgreSQL可以就地DEFAULT

所以:使用你在高并发情况下使用的相同方法来处理它,但没有你用它来处理并发的触发器。

  • ALTER TABLE ... ADD COLUMN ...没有任何DEFAULTNOT NULL
  • ALTER TABLE ... ALTER COLUMN ... DEFAULT ...添加DEFAULT(如果有)
  • UPDATE表中的批量行设置值。 VACUUM每批之间的表格。 使用VACUUM FULL。每个批处理必须是在VACUUM之前提交的新的单独事务。
  • 如果需要,ALTER TABLE ... ALTER COLUMN ... NOT NULL在所有行都设置了值
  • 之后

答案 1 :(得分:0)

根据我的快速谷歌搜索,Postgres不支持inplace add column。由于时间对您来说不是问题,您可以通过使用新架构创建新表来模拟就地add column,然后使用INSERT ... SELECT将旧表中的前100000行复制到新表,然后删除来自旧表的前100000行[1],并重复此过程,直到复制整个表。然后在最后只需删除旧表并重命名新表。这样,空间开销将始终保持不变。

[1] How do I delete a fixed number of rows with sorting in PostgreSQL?