gpt4 book ai didi

ruby-on-rails - 如何在不花很长时间的情况下更改大型 Postgres 表的默认值?

转载 作者:行者123 更新时间:2023-11-29 12:14:32 26 4
gpt4 key购买 nike

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

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

如果没有字段默认值或 NOT NULL,该列会立即添加。

作为临时解决方案,我添加了新列,没有任何限制,以 1000 条记录为一组,用假默认值更新所有记录,然后最后更改列以​​具有默认和 NOT NULL 要求。

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

有没有更好的解决方案?

最佳答案

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

ALTER TABLE mine.trivally
ADD COLUMN the_bool boolean NOT NULL DEFAULT 'True' ;

这表明您的框架生成了次优代码。至少可以说。

关于ruby-on-rails - 如何在不花很长时间的情况下更改大型 Postgres 表的默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7395485/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com