我有一个关于操作主表的问题:我需要在其中添加一个新列,但是已经有超过5000万个条目需要更新。
如果我不把数据存储在一个小的ssd上,而这个ssd已经被数据库填满了一半多一点,那就和alter表一样简单。
alter表无法完成,因为它创建了表的副本,然后才替换原始表。
两个拷贝不能放在我的ssd驱动器上,所以是否可以直接在原始表上操作,或者为临时表使用另一个驱动器?
或者我应该使用另一台计算机在更大的驱动器上更改表,然后只传输回我的ssd服务器?
提前谢谢!
注:时间不是真正的问题,它是阿尔法的一个非实时系统,几乎没有用户,所以我可以把所有东西都记下几个小时(感谢网络神!)

最佳答案

如果列没有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在所有行都设置了值之后

关于postgresql - ALTER TABLE在有限的磁盘空间上添加新列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33768823/

10-15 19:14