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

Performance 在大型postgres表上添加具有默认值的布尔字段,performance,postgresql,Performance,Postgresql,在某些情况下,我们有一个非常大的表(100万条记录),我们需要向其中添加具有默认值的布尔字段。 如果只添加列,则需要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 ,

在某些情况下,我们有一个非常大的表(100万条记录),我们需要向其中添加具有默认值的布尔字段。 如果只添加列,则需要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功能允许一次添加多个具有默认值的布尔字段?这适用于数据库更改管理/升级解决方案。是否比使用临时表复制和插入将多个具有默认值的布尔字段添加到表中更好?本博客介绍了临时表方法:

您已经展示了最好的(简单的)方法—一个复合的
ALTER TABLE
语句,它可以一次将它们全部相加


要在没有长锁的情况下完成,必须分多个步骤进行。将列添加为不带默认值的可空列。添加默认值,但将其保留为空<代码>更新所有现有行以添加新值,最好是成批添加。然后最后修改表以添加
notnull
约束。

“是否有postgres功能使其发生?”我不理解这个问题。使什么发生?(顺便说一下:一百万行远不是“非常大”)当我们更新列中的值时,Postgres会在磁盘中写入一个全新的行,弃用旧行,然后继续更新所有索引。这相当于每行插入加删除。所以在本例中,我们添加了3个布尔字段,Postgres是否一次性添加了这些字段?从头开始创建新表应该比更新每一行更快。顺序写入比稀疏更新更快。我已经使用temp table实现了一个解决方案,但是有了这个特性,我认为没有必要使用这样的解决方案。这是一个很麻烦的事情,但遗憾的是,这是避免长时间锁定表的唯一可靠方法。