在大型postgres表上添加默认值的布尔字段

时间:2015-11-12 13:41:56

标签: performance postgresql

在某些情况下,我们有一个非常大的表(1百万条记录),我们需要为它添加具有默认值的布尔字段。 如果我们只添加列,则需要3分钟,我们在相同的语句中添加3列,这需要相同的时间。

$ALTER TABLE Job ADD COLUMN test BOOLEAN NOT NULL default false;
ALTER TABLE
Time: 186506.603 ms

    $ALTER TABLE Job ADD COLUMN test BOOLEAN NOT NULL default false , 
    ADD COLUMN test1 BOOLEAN NOT NULL default false, 
    ADD COLUMN test2 BOOLEAN NOT NULL default false;
    ALTER TABLE
    Time: 179055.546 ms

我们在Postgres 9.1上。是否有postgres功能允许在一次拍摄中添加多个具有默认值的布尔字段?这适用于数据库更改管理/升级解决方案。是否比使用临时表复制和插入以将多个具有默认值的布尔字段添加到表中更好?本博客描述了临时表方法: http://blog.codacy.com/2015/05/14/how-to-update-large-tables-in-postgresql/

1 个答案:

答案 0 :(得分:3)

您已经展示了最好的(简单)方式 - 复合ALTER TABLE语句,可以一次性添加它们。

要做到这一点而不需要长时间锁定,您必须分多步完成。在没有默认值的情况下将列添加为可为空。添加默认值但保持可为空。 UPDATE所有现有行添加新值,最好是批量生成。然后最后更改表以添加not null约束。