首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何更改大型Postgres表的默认值而不会耗费太多时间?

如何更改大型Postgres表的默认值而不会耗费太多时间?
EN

Stack Overflow用户
提问于 2011-09-13 08:16:23
回答 2查看 1.2K关注 0票数 2

在Heroku上运行的Postgres支持的Rails应用程序上,我尝试添加一个布尔列,默认设置为false,null设置为false (非NULL)。

迁移需要几个小时才能运行(实际上大约有15个这样的字段需要添加)。内存使用量达到顶峰(5-6 6gb或更高)。我认为这是因为Postgres将迁移包装在一个事务中,并试图将整个表加载到内存中,以便在失败时可以回滚。

如果没有字段default或NOT NULL,该列很快就会被添加。

作为临时解决方案,我在没有任何限制的情况下添加新列,以1000条记录为一批更新所有具有错误缺省值的记录,最后将列更改为具有default和NOT NULL要求。

现在,迁移大约需要3-4个小时来运行,并且只使用大约100mb的RAM。

有没有更好的解决方案?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-13 18:01:08

从您的时间安排来看,我希望您通过RoR执行“升级”,这可能意味着“一次处理一行”。我刚刚用一个主键和3个外键在一个300K行的表上进行了测试,添加一个布尔值大约需要5秒(对我来说,太短了,无法对其进行准确的基准测试):

代码语言:javascript
运行
复制
ALTER TABLE mine.trivally
    ADD COLUMN the_bool boolean NOT NULL DEFAULT 'True' ;

这表明您的框架生成的代码不是最优的。至少可以这么说。

票数 2
EN

Stack Overflow用户

发布于 2011-09-13 08:22:42

查看large-hadron-migrator。它声称是一个执行大规模单表迁移的方案的实现。它比简单的迁移复杂得多,因为它使用几个背景表和一组触发器来完成迁移,要么完全在线,要么停机时间最短。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7395485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档