## 膨胀识别(可验证)


-- 安装扩展
CREATE EXTENSION IF NOT EXISTS pgstattuple;

-- 评估表与索引膨胀
SELECT * FROM pgstattuple('public.orders');
SELECT * FROM pgstatindex('public.orders_pkey');

-- 粗略观察:
SELECT relname, n_dead_tup
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC
LIMIT 20;

依据 `pgstattuple` 的空闲比例与死元组比例判断是否需要维护。


## 维护手段对比


  • `REINDEX`:重建索引,对单个索引生效,锁级别依索引与版本而定;适合索引膨胀明显且表数据稳定的场景。
  • `VACUUM FULL`:重写整表,释放空间,但会持有较长锁并阻塞写入;需严格的维护窗口。
  • `pg_repack`:在线重建表/索引(额外空间占用),对生产影响较小;需安装扩展与工具。

## 可复现流程


REINDEX:


REINDEX INDEX CONCURRENTLY orders_pkey;  -- 版本支持下尽量使用 CONCURRENTLY

VACUUM FULL:


VACUUM (FULL, ANALYZE) public.orders;   -- 维护窗口执行

pg_repack:


# 安装工具(不同发行版命令略有差异)
pg_repack --table=public.orders --dbname=postgresql://user:pass@host/db

## 回归验证


  • 维护前后执行 `pgstattuple`/`pgstatindex` 对比空闲比例与索引尺寸变化。
  • 采集关键查询的 `EXPLAIN ANALYZE`,确认计划与耗时是否改善。

## 注意事项


  • `VACUUM FULL` 会导致表膨胀的空间回收,但锁表风险高;优先评估 `REINDEX` 或 `pg_repack`。
  • 在线操作需预留额外磁盘空间;监控 I/O 与复制延迟以防影响主从。

## 结语


以量化的 bloat 评估与三种维护手段的可复现流程,把空间与性能问题纳入例行治理,确保长期稳定的查询与存储成本。



点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部