将 INCLUDE 项添加到 Postgres 11 中的主键索引

tom*_*mka 6 postgresql index constraint index-tuning

我使用 Postgres 11 并想更改支持大表(约 7.5 亿行)主键的索引。主键是bigintid,我想使用该INCLUDE术语包含一个额外的列。这需要在没有表重写的情况下发生(即没有新的/更改的列)。

删除当前PRIMARY KEY约束并不方便,因为很多其他表都引用了目标表。我想可以删除FOREIGN KEY所有这些表的PRIMARY KEY约束,然后删除约束,使用新索引重新创建,然后重新创建FOREIGN KEY约束。有没有更好的方法来做到这一点?

Lau*_*lbe 6

在不弄乱目录的情况下(这不值得称赞),我能想到的唯一选择是要求您暂时不使用外键:

UNIQUE您可以在包含适当子句的表上定义第二个索引INCLUDE

如果您使用CONCURRENTLY子句CREATE INDEX,那不应该造成破坏。

然后您可以使用删除原始主键约束和所有依赖的外键DROP INDEX ... CASCADE

然后使用ALTER TABLE ... ADD CONSTRAINT ... USING INDEX将唯一索引变成主键约束。

现在您可以重新创建外键约束。