数据库

pg_repack:物理存储优化与维护工具


pg_repack 是一个Postgres扩展,用于消除表和索引的膨胀,并可选择性地恢复聚簇索引的物理顺序。与CLUSTER和VACUUM FULL不同,pg_repack以"在线"方式运行,不会在处理表上持有排他锁,从而不会阻止正在进行的数据库操作。pg_repack的效率与直接使用CLUSTER相当。

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

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

pg_repack包含两个组件:数据库扩展和用于控制它的客户端CLI工具。

要求

  • 目标表必须具有PRIMARY KEY,或在NOT NULL列上具有UNIQUE总索引。
  • 执行全表重组需要约两倍于目标表及其索引大小的可用磁盘空间。

默认情况下,pg_repack需要Postgres超级用户角色。Supabase平台上的用户无法获得该角色。为避免此要求,在每个pg_repack CLI命令上使用-k--no-superuser-check标志。

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

1
2
3
select default_versionfrom pg_available_extensionswhere name = 'pg_repack';

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

使用方法

启用扩展

通过Supabase仪表板启用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锁来强制执行此限制。

资源