我正在对大型数据库执行架构更改,纠正古老的设计错误(将主键及其相应的外键从 扩展INTEGER到BIGINT)。基本流程是:
ALTER TABLE foo ALTER COLUMN bar TYPE BIGINT针对每个表和主/外键)。NOT VALID)。ALTER TABLE foo VALIDATE CONSTRAINT bar对于每个约束)。笔记:
问题出在最后的验证步骤中。当条件恰好“正确”时,单个用户ALTER TABLE foo VALIDATE CONSTRAINT bar可以以超出 WAL 写入容量的速度创建数据库写入。这会导致不同程度的不满,甚至导致数据库服务器崩溃。(我的理解是,Heroku 使用定制的 WAL 插件来实现他们的“连续备份”和“数据库跟随者”功能。我已经尝试就这个问题联系 Heroku 支持人员 - 他们的回应没有什么帮助,尽管我们'有关企业级支持合同)。
我的问题:将这些限制留在州内有什么坏处吗NOT VALID?
相关:有谁知道为什么验证约束会产生如此多的写入活动?
将约束保留为无效有一些缺点。首先,您可能有不满足约束要求的数据,这意味着您有不应该出现在表中的数据。但查询规划器也无法使用约束谓词来排除满足或不满足约束要求的行。
至于所有 WAL 活动,我只能想象这是因为它必须为这些行设置标志以将它们标记为有效。相对于实际的行更新,这应该会产生相对少量的 WAL,但我想如果您有足够的行被验证,它将生成大量的 WAL。除非存储空间已满,否则通常不会导致崩溃。
| 归档时间: |
|
| 查看次数: |
1173 次 |
| 最近记录: |