pg_squeeze

从关系中删除未使用空间

概览

扩展包名版本分类许可证语言
pg_squeeze1.9.1ADMINBSD 2-ClauseC
ID扩展名BinLibLoadCreateTrustReloc模式
5040pg_squeezesqueeze
相关扩展pg_repack pgfincore pg_prewarm pgstattuple pg_cooldown pgcozy amcheck pageinspect

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG1.9.11817161514pg_squeeze-
RPMPGDG1.9.11817161514pg_squeeze_$v-
DEBPGDG1.9.11817161514postgresql-$v-squeeze-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
PGDG 1.9.1
PGDG 1.9.1
PGDG 1.9.1
PGDG 1.9.1
PGDG 1.9.1
d12.aarch64
PGDG 1.9.1
PGDG 1.9.1
PGDG 1.9.1
PGDG 1.9.1
PGDG 1.9.1
d13.x86_64
PGDG 1.9.1
PGDG 1.9.1
PGDG 1.9.1
PGDG 1.9.1
PGDG 1.9.1
d13.aarch64
PGDG 1.9.1
PGDG 1.9.1
PGDG 1.9.1
PGDG 1.9.1
PGDG 1.9.1
u22.x86_64
u22.aarch64
u24.x86_64
u24.aarch64

安装

您可以直接安装 pg_squeeze 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_squeeze;          # 当前活跃 PG 版本安装
pig ext install -y pg_squeeze -v 18  # PG 18
pig ext install -y pg_squeeze -v 17  # PG 17
pig ext install -y pg_squeeze -v 16  # PG 16
pig ext install -y pg_squeeze -v 15  # PG 15
pig ext install -y pg_squeeze -v 14  # PG 14
dnf install -y pg_squeeze_18       # PG 18
dnf install -y pg_squeeze_17       # PG 17
dnf install -y pg_squeeze_16       # PG 16
dnf install -y pg_squeeze_15       # PG 15
dnf install -y pg_squeeze_14       # PG 14
apt install -y postgresql-18-squeeze   # PG 18
apt install -y postgresql-17-squeeze   # PG 17
apt install -y postgresql-16-squeeze   # PG 16
apt install -y postgresql-15-squeeze   # PG 15
apt install -y postgresql-14-squeeze   # PG 14

预加载配置

shared_preload_libraries = 'pg_squeeze';

创建扩展

CREATE EXTENSION pg_squeeze;

用法

pg_squeeze: 从关系中移除未使用空间的工具

pg_squeeze 需要设置 wal_level = logical,并且必须添加到 shared_preload_libraries 中。它使用逻辑解码而非触发器,在允许并发读写的同时移除表膨胀。

注册表进行定期处理

squeeze.tables 插入数据以启用定期膨胀检查:

INSERT INTO squeeze.tables (tabschema, tabname, schedule)
VALUES ('public', 'foo', ('{30}', '{22}', NULL, NULL, '{3, 5}'));

schedule 字段使用类似 crontab 的格式:(minutes, hours, days_of_month, months, days_of_week)。上面的配置在每周三和周五的 22:30 检查表 foo

可选列:free_space_extra(触发所需的最小额外空闲空间百分比,默认 50)、min_size(最小 MB 数,默认 8)、vacuum_max_age(距上次 VACUUM 的最大时间,默认 1小时)、max_retry(重试次数,默认 0)、clustering_index(按此索引排序元组)、rel_tablespaceind_tablespacesskip_analyze

临时压缩

SELECT squeeze.squeeze_table('public', 'pgbench_accounts');
SELECT squeeze.squeeze_table('public', 'mytable', 'my_cluster_idx', 'target_tablespace');

启动/停止工作进程

SELECT squeeze.start_worker();   -- 启动调度器和压缩工作进程
SELECT squeeze.stop_worker();    -- 停止当前数据库的所有工作进程

通过 postgresql.conf 在集群启动时自动启动:

squeeze.worker_autostart = 'my_database your_database'
squeeze.worker_role = postgres

监控

  • squeeze.log – 每个成功压缩的表对应一条记录(包含 startedfinishedins_initialinsupddel
  • squeeze.errors – 压缩过程中的错误
  • squeeze.get_active_workers() – 显示当前活动的压缩工作进程及其进度

配置

  • squeeze.max_xlock_time – 最大排他锁时间,毫秒(默认不限制)
  • squeeze.workers_per_database – 每个数据库的并发压缩工作进程数(默认 1)

最后修改 2026-03-14: update extension metadata (953cbd0)