我有一个关于操作主表的问题:我需要在其中添加一个新列,但是已经有超过5000万个条目需要更新。
如果我没有将数据存储在数据库已经填充了一半以上的小ssd上,那就像alter table一样容易。
alter table无法完成,因为它创建了表的副本,然后才替换原始表。
两个副本无法放在我的ssd驱动器上,所以可以直接在原始表上操作,还是使用另一个驱动器作为临时表? 或者我应该使用另一台计算机在更大的驱动器上更改我的表,然后只转移回我的ssd服务器?
提前致谢!
PS:时间不是真正的问题,它是一个几乎没有用户的非实时系统,因此我被允许将所有内容删除几个小时(感谢网络神!)答案 0 :(得分:2)
如果列没有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
在所有行都设置了值答案 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?