数据库

pg_repack: 物理存储优化和维护


pg_repack 是一个 Postgres 扩展,用于移除表和索引中的膨胀,并可选地恢复聚簇索引的物理顺序。与 CLUSTER 和 VACUUM FULL 不同,pg_repack 在“在线”状态下运行,并且不会对正在处理的表持有阻止持续数据库操作的独占锁。pg_repack 的效率与直接使用 CLUSTER 相当。

pg_repack 提供以下方法来优化物理存储

  • 在线 CLUSTER:以非阻塞方式按聚簇索引对表数据进行排序
  • 按指定的列对表数据进行排序
  • 在线 VACUUM FULL:仅以非阻塞方式打包行
  • 重建或重新定位表的索引

pg_repack 有 2 个组件,数据库扩展和客户端 CLI,用于控制它。

要求#

  • 目标表必须具有 PRIMARY KEY,或者在 NOT NULL 列上具有唯一的总索引。
  • 执行全表 repack 需要大约是目标表及其索引两倍的可用磁盘空间。

pg_repack 默认需要 Postgres 超级用户角色。该角色在 Supabase 平台上不可用。为了避免此要求,请在每个 pg_repack CLI 命令中使用 -k--no-superuser-check 标志。

pg_repack 的第一个版本完全支持非超级用户 repack 是 1.5.2。您可以使用以下命令检查 Supabase 实例上安装的版本:

1
select default_version
2
from pg_available_extensions
3
where name = 'pg_repack';

如果 pg_repack 不存在,或者版本低于 1.5.2,请 升级到最新版本的 Supabase 以获得访问权限。

用法#

启用扩展#

通过在 Supabase Dashboard 中启用扩展来开始使用 pg_repack。

  1. 转到仪表板中的 数据库 页面。
  2. 在侧边栏中单击 扩展
  3. 搜索 "pg_repack" 并启用扩展。

安装 CLI#

从 pg_repack 文档中选择一个选项来 安装客户端 CLI

语法#

所有 pg_repack 命令都应包含 -k 标志以跳过客户端的超级用户检查。

1
pg_repack -k [OPTION]... [DBNAME]

示例#

对数据库 postgres 中的表 public.foopublic.bar 执行在线 VACUUM FULL

1
pg_repack -k -h db.<PROJECT_REF>.supabase.co -p 5432 -U postgres -d postgres --no-order --table public.foo --table public.bar

有关完整选项列表,请参阅 官方 pg_repack 文档

限制#

  • pg_repack 无法重新组织临时表。
  • pg_repack 无法通过 GiST 索引对表进行聚簇。
  • 在 pg_repack 正在工作时,除了 VACUUM 或 ANALYZE 之外,您无法对目标表执行 DDL 命令。pg_repack 对目标表持有 ACCESS SHARE 锁以强制执行此限制。

资源#