如何安全地在 postgres 上重新索引主键?

fro*_*roi 8 postgresql

我们有一个巨大的表,其中包含主键索引上的膨胀。我们不断地将旧记录归档在该表上。

我们通过同时重新创建索引并删除旧的来重新索引其他列。这是为了避免干扰生产流量。但这对于主键是不可能的,因为有依赖于它的外键。至少基于我们的尝试。

在不阻塞表上的 DML 语句的情况下安全地重新索引主键的正确方法是什么?

ami*_*ena 5

REINDEX CONCURRENTLY似乎也有效。我在我的数据库上尝试过,没有收到任何错误。

REINDEX INDEX CONCURRENTLY <indexname>;
Run Code Online (Sandbox Code Playgroud)

我认为它可能会做与 @jlandercy 在他的回答中描述的类似的事情。当重新索引运行时,我看到一个带有后缀的索引_ccnew,并且现有的索引也完好无损。最终我猜想该索引在删除旧索引后被重命名为原始索引,并且我最终在表上看到了一个唯一的主索引。

我正在使用 postgres v12.7


len*_*len 2

您可以为此使用 pg_repack。

pg_repack 是一个 PostgreSQL 扩展,它允许您删除表和索引的膨胀,并可选择恢复聚集索引的物理顺序。

整个过程中它不持有独占锁。它仍然会执行一些锁定,但这应该只持续很短的一段时间。您可以在这里查看详细信息: https: //reorg.github.io/pg_repack/

要对索引执行重新打包,您可以尝试:

pg_repack -t table_name --only-indexes
Run Code Online (Sandbox Code Playgroud)