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实例上安装的版本:
123select default_versionfrom pg_available_extensionswhere name = 'pg_repack';
如果pg_repack不存在,或版本低于1.5.2,请升级到最新版本的Supabase以获取访问权限。
使用方法
启用扩展
通过Supabase仪表板启用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锁来强制执行此限制。