PostgreSQL 的 表膨胀(Table Bloat) 是数据库中由于 MVCC(多版本并发控制)机制导致的一种常见性能问题,表现为物理存储空间远大于实际有效数据量。以下是详细解释及其危害:


一、表膨胀的产生原因

1. MVCC 机制的核心问题
  • PostgreSQL 使用 MVCC 实现高并发,数据更新/删除时不直接覆盖旧数据,而是:
    • 插入新版本的行(新元组)
    • 将旧版本标记为死元组(Dead Tuples)
  • 例如:
    UPDATE users SET name = 'Bob' WHERE id = 1; -- 原行变为死元组,新增一行
    DELETE FROM orders WHERE id = 100;         -- 被删除的行成为死元组
    
2. VACUUM 的清理延迟
  • 死元组需通过 VACUUM 回收
    • 自动清理(autovacuum):后台进程定期清理死元组。
    • 手动清理:执行 VACUUM FULLVACUUM ANALYZE
  • 问题根源
    • 若死元组生成速度 > 清理速度 → 死元组堆积 → 表膨胀
    • 常见场景:高频更新/删除的大表、未合理配置 autovacuum。

二、表膨胀的危害

1. 存储空间浪费
  • 现象:表或索引的物理文件(表名.oid文件)持续增大,但有效数据量很小。
  • 示例
    • 实际数据 10GB,表文件可能膨胀到 100GB。
  • 影响:存储成本飙升,磁盘空间不足导致数据库宕机。
2. 查询性能下降
  • I/O 效率降低
    • 查询需扫描更多物理块(包含死元组)→ 磁盘 I/O 压力增大
  • 索引性能劣化
    • 索引指向死元组 → 冗余扫描 → 索引失效(即使命中索引也需回表过滤死元组)。
  • 示例
    SELECT * FROM large_table WHERE status = 'active'; -- 需扫描大量无效数据
    
3. 运维风险增加
  • VACUUM 效率降低
    • 膨胀越严重,VACUUM 耗时越长 → 可能阻塞业务操作。
  • 备份与恢复变慢
    • pg_dump 或 PITR(时间点恢复)需处理更多物理数据。
  • 复制延迟
    • 逻辑复制(Logical Replication)需解析更多无效数据。
4. 事务 ID 耗尽风险
  • 未清理的死元组可能导致 事务 ID 回卷(Transaction ID Wraparound)
    • PostgreSQL 事务 ID 为 32 位计数器,最多 42 亿次事务。
    • 若死元组过多导致 VACUUM 无法推进 pg_xact 中的事务年龄 → 数据库强制进入只读模式(防止数据损坏)。

三、诊断表膨胀

1. 系统视图检查
-- 查看表膨胀程度(pgstattuple 扩展)
CREATE EXTENSION pgstattuple;
SELECT * FROM pgstattuple('表名');-- 通用查询(按膨胀率排序)
SELECT schemaname || '.' || relname AS "表名",pg_size_pretty(pg_total_relation_size(relid)) AS "总大小",pg_size_pretty(pg_total_relation_size(relid) - pg_relation_size(relid)) AS "索引膨胀",n_dead_tup AS "死元组数"
FROM pg_stat_all_tables
ORDER BY n_dead_tup DESC;
2. 关键指标
  • pg_stat_all_tables.n_dead_tup:当前死元组数量。
  • pg_stat_all_tables.last_autovacuum:最后一次自动清理时间。

四、解决方案

1. 优化 autovacuum 配置
-- 针对大表单独配置(示例)
ALTER TABLE large_table SET (autovacuum_vacuum_scale_factor = 0.01, -- 死元组超过1%即触发autovacuum_vacuum_cost_limit = 2000    -- 提高清理速度
);
2. 手动清理
  • 常规清理(不锁表):
    VACUUM ANALYZE 表名; -- 回收空间并可更新统计信息
    
  • 彻底重建(需锁表):
    VACUUM FULL 表名;    -- 重建表文件,彻底消除碎片
    
3. 预防措施
  • 分区表:将大表按时间/范围分区,减少单次操作影响。
  • 避免全表更新:如 UPDATE table SET col = col + 1 改为分批更新。
  • 使用 TRUNCATE 替代 DELETE:清空表时直接回收空间。
4. 高级工具
  • pg_repack:在线重建表(无需长时间锁表)。
  • pg_squeeze:自动化定时压缩表。

五、总结

问题原因解决方案
死元组堆积MVCC 机制 + VACUUM 延迟优化 autovacuum 或手动 VACUUM
查询性能下降扫描大量无效数据定期清理 + 重建索引
事务 ID 回卷风险长事务阻塞清理监控事务年龄,紧急时强制 VACUUM

⚠️ 关键建议

  1. 监控 n_dead_tup 和 autovacuum 频率;
  2. 对高频写业务单独配置 autovacuum 参数;
  3. 避免在高峰时段运行 VACUUM FULL(改用 pg_repack)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/921042.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/921042.shtml
英文地址,请注明出处:http://en.pswp.cn/news/921042.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch面试精讲 Day 5:倒排索引原理与实现

【Elasticsearch面试精讲 Day 5】倒排索引原理与实现 在“Elasticsearch面试精讲”系列的第五天,我们将深入探讨搜索引擎最核心的技术基石——倒排索引(Inverted Index)。作为全文检索系统的灵魂,倒排索引直接决定了Elasticsearc…

【小白笔记】基本的Linux命令来查看服务器的CPU、内存、磁盘和系统信息

一、 核心概念与命令知识点英文名词&#xff08;词源解释&#xff09;作用与命令CPU (中央处理器)Central Processing Unit&#xff1a;<br> - Central&#xff08;中心的&#xff09;&#xff1a;来自拉丁语 centralis&#xff0c;意为“中心的”。<br> - Process…

51c大模型~合集177

自己的原文哦~ https://blog.51cto.com/whaosoft/14154064 #公开V3/R1训练全部细节&#xff01; 刚刚&#xff0c;DeepSeek最新发文&#xff0c;回应国家新规 AI 生成的内容该不该打上“水印”&#xff1f;网信办《合成内容标识方法》正式生效后&#xff0c;De…

CA根证书的层级关系和验证流程

CA根证书的层级关系和验证流程&#xff1a;1. 证书层级结构&#xff08;树状图&#xff09; [根证书 (Root CA)] │ ├── [中间证书 (Intermediate CA 1)] │ │ │ ├── [网站证书 (example.com)] │ └── [邮件证书 (mail.example.com)] │ └── [中间证书 (In…

液态神经网络(LNN)1:LTC改进成CFC思路

从液态时间常数网络&#xff08;Liquid Time-Constant Networks, LTC&#xff09;到其闭式解版本——闭式连续时间网络&#xff08;Closed-form Continuous-time Networks, CfC&#xff09; 的推导过程&#xff0c;可以分为以下几个关键步骤。我们将基于你提供的两篇论文&#…

【图像处理基石】图像预处理方面有哪些经典的算法?

图像预处理是计算机视觉任务&#xff08;如目标检测、图像分割、人脸识别&#xff09;的基础步骤&#xff0c;核心目的是消除图像中的噪声、提升对比度、修正几何畸变等&#xff0c;为后续高阶处理提供高质量输入。以下先系统梳理经典算法&#xff0c;再通过Python实现2个高频应…

MySQL 多表查询方法

MySQL 多表查询方法MySQL 多表查询用于从多个表中检索数据&#xff0c;通常通过关联字段&#xff08;如外键&#xff09;实现。以下是常见的多表查询方式&#xff1a;内连接&#xff08;INNER JOIN&#xff09;内连接返回两个表中匹配的行。语法如下&#xff1a;SELECT 列名 F…

网络断连与业务中断的全链路诊断与解决之道(面试场景题)

目录 1. 网络链路的“命脉”:从物理层到应用层的排查逻辑 物理层:别小看那一根网线 数据链路层:MAC地址和交换机的“恩怨情仇” 工具推荐:抓包初探 2. 网络层的“幕后黑手”:IP冲突与路由迷雾 IP冲突:谁抢了我的地址? 路由问题:数据包的“迷路”之旅 3. 传输层与…

英伟达Newton与OpenTwins如何重构具身智能“伴随式数采”范式

具身智能的“数据饥荒”&#xff1a;行业痛点与技术瓶颈的深度剖析1.1 具身智能的现状与核心挑战Embodied AI的落地之路面临着多重严峻挑战。在算法层面&#xff0c;实现通用智能仍需人类的持续介入&#xff0c;并且从感知到行动的认知映射尚未完全打通。在硬件层面&#xff0c…

STM32HAL 快速入门(十六):UART 协议 —— 异步串行通信的底层逻辑

大家好&#xff0c;这里是 Hello_Embed。在前几篇中&#xff0c;我们通过环形缓冲区解决了按键数据丢失问题&#xff0c;而在嵌入式系统中&#xff0c;设备间的数据交互&#xff08;如单片机与电脑、传感器的通信&#xff09;同样至关重要。UART&#xff08;通用异步收发传输器…

使用 C 模仿 C++ 模板的拙劣方法

如下所示&#xff0c;准备两个宏&#xff0c;一个定义类型&#xff0c;一个定义容器大小。 使用时只要先定义这两个宏&#xff0c;然后再包含容器头文件就能生成不同类型和大小的容器了。但是这种方法只允许在源文件中使用&#xff0c;如果在头文件中使用&#xff0c;定义不同类…

flume接收处理器:构建高可用与高性能的数据链路

flume接收处理器&#xff1a;构建高可用与高性能的数据链路 在大规模数据采集场景中&#xff0c;单点故障和性能瓶颈是两大核心挑战。Flume 通过 Sink Group 接收处理器&#xff08;Processor&#xff09; 机制&#xff0c;提供了强大的故障转移&#xff08;Failover&#xf…

高级Kafka应用之流处理

40 Kafka Streams与其他流处理平台的差异在哪里&#xff1f; 什么是流处理平台&#xff1f; “Streaming Systems”一书是这么定义“流处理平台”的&#xff1a;流处理平台&#xff08;Streaming System&#xff09;是处理无限数据集&#xff08;Unbounded Dataset&#xff09;…

Custom SRP - LOD and Reflections

1 LOD Groups 场景中对象越多,场景就越丰富,但是过多的对象,也会增加 CPU 和 GPU 的负担.同时如果对象最终渲染在屏幕上后覆盖的像素太少,就会产生模糊不清的像素点/噪点.如果能够不渲染这些过小的对象,就能解决噪点问题,同时释放 CPU GPU,去处理更重要的对象. 裁剪掉这些对象…

【Linux篇章】互联网身份密码:解密 Session 与 Cookie 的隐藏玩法和致命漏洞!

本篇摘要 本篇将承接上篇HTTP讲解&#xff08; 戳我查看 &#xff09;遗留的关于Cookie与Session的介绍&#xff0c;在本篇&#xff0c;将会介绍Cookie的由来&#xff0c;作用&#xff0c;以及缺点等&#xff0c;进而引出Session&#xff0c;最后介绍一下它们的性质等&#xf…

Postman接口测试工具:高效管理测试用例与环境变量,支持断言验证及团队协作同步

之前跟你们聊过能搭知识网络的 Obsidian&#xff0c;今天换个偏向接口测试的方向 —— 给你们安利一个 Github 上的「Postman」&#xff0c;它是个接口测试工具&#xff0c;官网能直接下载&#xff08;Postman: The Worlds Leading API Platform | Sign Up for Free&#xff09…

可可图片编辑 HarmonyOS 上架应用分享

可可图片编辑 HarmonyOS 上架应用分享 介绍 可可图片编辑 原名 图片编辑大师&#xff0c;因为上架审核的时候 &#xff0c;提示与一些已有应用重名&#xff0c;为了避免冲突&#xff0c;需要改名字&#xff0c;所以苦心思考了一分钟&#xff0c;就调整成 可可图片编辑。 应用…

Notepad++近期版本避雷

近期Notepad若干版本存在投毒事件&#xff0c;虽然也欢迎大家使用替代软件&#xff0c;但是Notepad作为一款开源软件&#xff0c;如有需要也可以继续白嫖使用&#xff0c;但是请务必避开若干埋雷版本&#xff01; 经检查&#xff0c;部分版本在帮助菜单中加入了有关tw的部分个人…

【lucene核心】impacts的由来

在 Lucene 的 Impact 概念&#xff08;出现在 ImpactsEnum / Impact 对象里&#xff09;中&#xff1a;字段 含义 freq 当前 term 在该文档中出现了多少次&#xff08;即词频 term frequency&#xff09;。 norm 当前 文档在该字段中的长度因子&#xff08;即之前 norms 里保存…

基于Echarts+HTML5可视化数据大屏展示-惠民服务平台

效果展示代码结构&#xff1a;主要代码实现 index.html布局 <!doctype html> <html><head><meta charset"utf-8"><title>双数智慧公卫-传染病督导平台</title><meta http-equiv"refresh" content"60;urlhttps…