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 实例上安装的版本:
1select default_version2from pg_available_extensions3where name = 'pg_repack';如果 pg_repack 不存在,或者版本低于 1.5.2,请 升级到最新版本的 Supabase 以获得访问权限。
用法#
启用扩展#
通过在 Supabase Dashboard 中启用扩展来开始使用 pg_repack。
- 转到仪表板中的 数据库 页面。
- 在侧边栏中单击 扩展。
- 搜索 "pg_repack" 并启用扩展。
安装 CLI#
从 pg_repack 文档中选择一个选项来 安装客户端 CLI。
语法#
所有 pg_repack 命令都应包含 -k 标志以跳过客户端的超级用户检查。
1pg_repack -k [OPTION]... [DBNAME]示例#
对数据库 postgres 中的表 public.foo 和 public.bar 执行在线 VACUUM FULL
1pg_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 锁以强制执行此限制。