在PostgreSQL中添加具有默认值的列而没有表级锁

时间:2018-07-04 08:03:53

标签: postgresql

存在这样的问题-包含超过2000万行的表。

当我使用默认值添加新列时-postgresql锁定表超过40分钟,因此我的应用程序此时停止工作。

所以不是

ALTER TABLE "test" ADD COLUMN "field" boolean DEFAULT True NOT NULL;

我愿意

ALTER TABLE "test" ADD COLUMN "field" boolean NULL;
ALTER TABLE "test" ALTER COLUMN "field" SET DEFAULT true;

默认情况下,每个新行在默认情况下都为true,因此现在我需要更新2000万当前行。

我分批更新它们:

WITH cte AS (
SELECT id as pk
FROM "test"
WHERE  "field" is null
LIMIT  10000
)
UPDATE "test" table_
SET "field" = true
FROM   cte
WHERE  table_.id = cte.pk

之后我要做

ALTER TABLE "test" ALTER COLUMN "field" SET NOT NULL;

一切都很好,但是当我更新行时速度太慢。您能给我一些有关提高更新速度的建议吗?

当前,它在大约2分钟内更新10000。 我尝试将大小减小到1000-更好(10000时为3.5分钟),但速度仍然很慢。

我也尝试在更新之前创建索引,但是它不会给出更好的结果(据我了解,它将提供更好的结果,但是当表的巨大路径将被更新时)。

1 个答案:

答案 0 :(得分:2)

您可以使用HOT来加快UPDATE的速度。这就要求未对更新的列进行索引(以您的情况为准),并且表块中有可用空间(fillfactor <100)。不确定您是否满足第二个要求。

提高批量更新速度的另一件事是增加max_wal_size,以使检查点不会经常出现。

也许您可以等几个月PostgreSQL v11。以下新功能将满足您的需求:

  
      
  • 允许ALTER TABLE添加具有非空默认值的列,而无需重写表(Andrew Dunstan,Serge Rielau)
  •   
相关问题