存在这样的问题-包含超过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分钟),但速度仍然很慢。
我也尝试在更新之前创建索引,但是它不会给出更好的结果(据我了解,它将提供更好的结果,但是当表的巨大路径将被更新时)。
答案 0 :(得分:2)
您可以使用HOT来加快UPDATE
的速度。这就要求未对更新的列进行索引(以您的情况为准),并且表块中有可用空间(fillfactor
<100)。不确定您是否满足第二个要求。
提高批量更新速度的另一件事是增加max_wal_size
,以使检查点不会经常出现。
也许您可以等几个月PostgreSQL v11。以下新功能将满足您的需求:
- 允许
ALTER TABLE
添加具有非空默认值的列,而无需重写表(Andrew Dunstan,Serge Rielau)