PostgreSQL表膨脹的危害與解決方案

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…