繁体   English   中英

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

[英]Add column with default in postgresql without table level lock

遇到这样的问题-超过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,因此现在我需要更新20mln当前行。

我分批更新它们:

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分钟),但速度仍然很慢。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM