我有一个关于操作主表的问题:我需要在其中添加一个新列,但是已经有超过5000万个条目需要更新。
如果我不把数据存储在一个小的ssd上,而这个ssd已经被数据库填满了一半多一点,那就和alter表一样简单。
alter表无法完成,因为它创建了表的副本,然后才替换原始表。
两个拷贝不能放在我的ssd驱动器上,所以是否可以直接在原始表上操作,或者为临时表使用另一个驱动器?
或者我应该使用另一台计算机在更大的驱动器上更改表,然后只传输回我的ssd服务器?
提前谢谢!
注:时间不是真正的问题,它是阿尔法的一个非实时系统,几乎没有用户,所以我可以把所有东西都记下几个小时(感谢网络神!)
最佳答案
如果列没有ADD COLUMN
并且可以为空,PostgreSQL可以执行就地DEFAULT
操作。
所以:使用与在高并发情况下处理它相同的方法,但不使用用于处理并发情况的触发器。ALTER TABLE ... ADD COLUMN ...
没有任何DEFAULT
或NOT NULL
ALTER TABLE ... ALTER COLUMN ... DEFAULT ...
添加DEFAULT
如果有UPDATE
按行分批设置值的表。VACUUM
每批之间的表格。不要使用VACUUM FULL
。每个批都必须是一个新的、独立的事务,在VACUUM
之前提交。
如果需要,ALTER TABLE ... ALTER COLUMN ... NOT NULL
在所有行都设置了值之后
关于postgresql - ALTER TABLE在有限的磁盘空间上添加新列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33768823/