我更改了表结构,并且即将从大约 250 万行的大表中删除旧的 JSONB 列。JSONB 使这个表变得非常大 - pg_total_relation_size:408GB
执行ALTER TABLE ... DROP COLUMN ..;
过于繁重,以至于阻塞了整个数据库并导致大多数服务出现 502 错误。
问题:如果我在执行 ALTER TABLE DROP COLUMN 之前将 JSONB 列设置为 NULL,它会更快吗?或者是否还有其他选项,除了处理所有列的选项之外,除了旨在放入单独的表并随后交换名称的选项之外?
ALTER TABLE ... DROP COLUMN
总是非常快,因为它是元数据操作。如果您需要很长时间,那是因为存在使用该表的并发长时间运行事务:ALTER TABLE
修改表结构的语句需要ACCESS EXCLUSIVE
与其他所有内容冲突的锁。您必须等待没有人使用该表的时间来运行您的语句。
更大的问题是,这
ALTER TABLE ... DROP COLUMN
不会减少表的大小——它只会导致 PostgreSQL“忽略”现有行中的列数据。要真正删除该列,您必须执行无效的数据修改,例如
这将重写整个表。然而,由于 PostgreSQL 的多版本架构,这将大大增加表的大小。
所以你最终会像这样分批进行
并
VACUUM
在每批之后在桌子上运行。删除列后缩小表的另一种更简单的方法是
pg_dump
,DROP
然后恢复它。