337p人体粉嫩胞高清图片,97人妻精品一区二区三区在线 ,日本少妇自慰免费完整版,99精品国产福久久久久久,久久精品国产亚洲av热一区,国产aaaaaa一级毛片,国产99久久九九精品无码,久久精品国产亚洲AV成人公司
網易首頁 > 網易號 > 正文 申請入駐

OpenTeleDB 征文精選|我用三個場景驗證了 OpenTeleDB XStore 的"零膨脹"到底是不是真的

0
分享至

OpenTeleDB 數據庫線上征文活動優秀作品來襲!本篇為精選文章,分享實戰經驗與技術感悟,敬請閱讀。

用過 PostgreSQL 的人都知道,MVCC 機制帶來了優秀的并發性能,但也埋下了一個 "定時炸彈"——表膨脹。每次 UPDATE 操作都會產生一條新版本記錄,舊記錄成為 "死元組"(dead tuples),只能等 VACUUM 來清理。

在我維護的一個審計日志系統中,每天寫入幾十萬條記錄,偶爾還有批量更新操作。運行一段時間后,表從最初的 100MB 膨脹到 2GB,查詢性能直線下降。定期跑 VACUUM FULL 雖然能解決問題,但會鎖表,在業務高峰期根本不敢執行。

最近看到 OpenTeleDB 開源了,它的 XStore 引擎號稱 "原地更新、零膨脹",我第一反應是:又是營銷話術?抱著懷疑的態度,我決定親自驗證一下。

XStore 的核心原理

XStore 與傳統 Heap 引擎的本質區別在于數據更新方式:

Heap 引擎(PostgreSQL 默認):UPDATE 時創建新版本,標記舊版本為死元組,依賴 VACUUM 回收空間。這種 "追加寫" 模式在高頻更新場景下會導致表體積快速膨脹。

XStore 引擎:采用 "原地更新" 策略,配合獨立的 Undo Log 管理舊版本數據。更新操作直接修改原記錄位置,舊數據寫入 Undo 空間,由后臺的 discard_worker 進程自動回收。表本身不會產生死元組,也就不需要 VACUUM。

從日志中可以看到 XStore 的 Undo 回收機制在持續工作:

discard_worker_main: update globalRecycleXid: oldestXmin=202754...

這意味著 Undo 空間會隨著事務推進自動清理,不需要人工干預。

測試環境與準備

本次測試在一臺云服務器上進行,配置如下:

項目

配置

操作系統

CentOS 7.9 x86_64

數據庫

OpenTeleDB v2.0 (PostgreSQL 17.6)

CPU

2 核

內存

2GB

存儲

SSD 40GB


驗證啟動:


XStore 引擎在 OpenTeleDB 中以擴展形式提供,啟用方式很簡單:

CREATE EXTENSION xstore;
ALTERDATABASE bench_xstore SET default_table_access_method = 'xstore';

執行后,該數據庫中新建的表會默認使用 XStore 引擎。


上圖展示了在 bench_xstore 數據庫中啟用 XStore 擴展,并用 pgbench -i -s 10 初始化測試表的過程。整個初始化在 4.20 秒內完成。

場景一:pgbench 標準壓測對比

pgbench 是 PostgreSQL 自帶的基準測試工具,模擬 TPC-B 類型的事務負載,包含大量的 UPDATE 操作,非常適合測試存儲引擎在高頻更新場景下的表現。

Heap 引擎壓測

對 bench_heap 數據庫執行 100 并發、60 秒壓測:

pgbench-c100-j4-T60bench_heap


Heap 引擎結果

  • TPS:1819.97(不含連接建立時間)

  • 平均延遲:54.946 ms

  • 事務總數:109,291

  • 失敗事務:0

XStore 引擎壓測

同樣的壓測參數應用于 bench_xstore 數據庫:


XStore 引擎結果

  • TPS:1544.53(不含連接建立時間)

  • 平均延遲:64.745 ms

  • 事務總數:92,622

  • 失敗事務:0

從吞吐量看,XStore 比 Heap 低約 15%。這符合預期 ------ 原地更新需要額外維護 Undo Log,單次寫入開銷略高。但 XStore 的優勢不在瞬時性能,而在長期運行的穩定性。

關鍵差異:死元組統計

壓測結束后,對比兩個數據庫的空間占用和死元組情況:


指標

Heap 引擎

XStore 引擎

數據庫大小

167 MB

178 MB

死元組數量

37,502

0

這就是核心差異。Heap 引擎積累了 37,502 個死元組,如果不及時 VACUUM,這些 "垃圾" 會持續累積,表體積不斷膨脹。而 XStore 的死元組始終為 0,Undo 空間由 discard_worker 自動回收。

場景二:業務訂單表高頻更新

pgbench 是標準化測試,接下來模擬一個更貼近實際業務的場景:訂單狀態流轉。

創建訂單表

使用 XStore 引擎創建一張訂單表,插入 10 萬條測試數據:

CREATETABLE orders (
order_id BIGSERIAL PRIMARY KEY,
user_id INTNOTNULL,
product_id INTNOTNULL,
quantity INTDEFAULT1,
statusVARCHAR(20) DEFAULT'pending',
total_amount DECIMAL(10,2),
created_at TIMESTAMPDEFAULTNOW(),
updated_at TIMESTAMPDEFAULTNOW()
) USING xstore;

CREATEINDEX idx_orders_user ON orders(user_id);
CREATEINDEX idx_orders_status ON orders(status);

INSERTINTO orders (user_id, product_id, quantity, total_amount)
SELECT
(random() * 10000)::int,
(random() * 1000)::int,
(random() * 5 + 1)::int,
(random() * 1000)::decimal(10,2)
FROM generate_series(1, 100000);


初始空間占用

數據插入后,查看表的初始大小:


初始大小為 8,272 KB(約 8MB)。

模擬訂單狀態流轉

在真實業務中,訂單會經歷 pending → paid → shipped → delivered → completed 的狀態變更。用一個循環模擬 5 輪全表更新:

DO $$
DECLARE
i INT;
BEGIN
FOR i IN1..5LOOP
UPDATE orders SET
status = CASE
WHENstatus = 'pending'THEN'paid'
WHENstatus = 'paid'THEN'shipped'
WHENstatus = 'shipped'THEN'delivered'
WHENstatus = 'delivered'THEN'completed'
ELSEstatus
END,
updated_at = NOW();
RAISE NOTICE 'Round % completed', i;
ENDLOOP;
END $$;

5 輪更新意味著 10 萬行 × 5 次 = 50 萬次 UPDATE 操作。


更新完成后,表大小從 8MB 增長到 16MB ,翻了一倍。這個增長主要來自 updated_at 時間戳字段的變化,以及 XStore 引擎內部的空間管理開銷。

值得注意的是,圖中顯示死元組為 97,829。這是因為 pg_stat_user_tables 的統計信息存在延遲,XStore 的 discard_worker 正在后臺回收這些 Undo 記錄。等待片刻后重新查詢,死元組會降為 0。

場景三:審計日志高頻寫入

審計日志是典型的 "只增不刪、偶爾更新" 場景,數據量大,更新頻繁,最容易出現表膨脹問題。

創建審計日志表

CREATETABLE audit_log (
id BIGSERIAL PRIMARY KEY,
table_name VARCHAR(50),
operation VARCHAR(10),
old_data JSONB,
new_data JSONB,
user_id INT,
ip_address INET,
created_at TIMESTAMPDEFAULTNOW()
) USING xstore;


CREATEINDEX idx_audit_created ON audit_log(created_at);
CREATEINDEX idx_audit_table ON audit_log(table_name);
模擬 7 天數據寫入

每天寫入 10 萬條記錄,模擬一周的審計數據:


7 天共插入 70 萬條記錄

查看表空間


指標

數值

表大小

107 MB

索引大小

27 MB

活躍行數

700,000

死元組

0

70 萬條 JSONB 數據,表大小 107MB,死元組為 0。

模擬批量更新

假設需要對前 10 萬條記錄做一次數據訂正:

UPDATE audit_log
SET new_data = new_data || '{"corrected": true}'::jsonb
WHEREid <= 100000;


更新 10 萬條記錄后:

  • 表大小:107 MB → 123 MB

  • 死元組:仍為 0

空間增長了 16MB,這是 JSONB 字段追加新鍵值對導致的數據本身變大,而不是死元組膨脹。如果用傳統 Heap 引擎執行同樣的操作,會產生 10 萬個死元組,表體積可能翻倍。

日志中可以看到 discard_worker 持續在工作:

discard_worker_main: update globalRecycleXid: oldestXmin=202754...loops=1382

loops=1382 表示 Undo 回收循環已經執行了 1382 次,系統在自動維護存儲空間。

性能與空間的權衡

通過三個場景的測試,可以總結出 XStore 與 Heap 的特性對比:

維度

Heap 引擎

XStore 引擎

單次寫入性能

較高(追加寫)

略低(原地更新 + Undo)

死元組

會累積,需 VACUUM

始終為 0

表膨脹

嚴重(不及時清理會翻倍)

無膨脹

維護成本

需要調優 VACUUM 參數

自動回收,無需干預

適用場景

讀多寫少、批量導入

高頻更新、長期運行

XStore 的 TPS 比 Heap 低 15% 左右,但換來的是零運維成本和穩定的存儲空間。對于審計日志、訂單系統、IoT 數據采集這類高頻寫入場景,XStore 的長期收益遠超過那點性能差距。

我的體驗總結

說實話,測試之前我對 "零膨脹" 這個宣傳是半信半疑的。但跑完三個場景后,我確實服了 ------70 萬條審計記錄 + 10 萬次更新,死元組始終是 0,這在傳統 Heap 引擎上根本不可能。

讓我印象最深的是 discard_worker 這個后臺進程。以前用 PostgreSQL,我得時刻盯著 pg_stat_user_tables 的死元組數量,一旦超過閾值就得手動跑 VACUUM。現在 XStore 把這事全自動化了,我甚至不用關心 Undo 空間 ------ 它自己會清理。

當然,XStore 也有它的代價 ------ 從測試數據看,它的 TPS 比 Heap 低 15% 左右。但這點性能差距換來的是零膨脹和零運維,對于高頻更新、長周期運行的業務來說,絕對劃算。如果你像我一樣被 VACUUM 調優折騰過,XStore 真的值得一試。

技術選型沒有銀彈,關鍵是理解自己的業務特點。這次體驗讓我對 OpenTeleDB 有了更多期待,后續我打算再測試一下它的 XProxy 高并發連接能力。

參考資料

  • OpenTeleDB 社區:https://openteledb.cn/

  • OpenTeleDB Gitee 倉庫:https://gitee.com/teledb/openteledb

  • PostgreSQL 官方文檔 - Table Access Method:https://www.postgresql.org/docs/17/tableam.html

  • MVCC 與 Vacuum 機制解析:https://www.postgresql.org/docs/17/routine-vacuuming.html

作者:一只牛博

特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關推薦
熱點推薦
歐爾班輸掉大選恐被對手清算:支持率落后對手19%,大勢已去了!

歐爾班輸掉大選恐被對手清算:支持率落后對手19%,大勢已去了!

觀星賞月
2026-04-04 01:28:58
這就是回家要脫褲子才能上床的原因!網友:看完天都塌了!

這就是回家要脫褲子才能上床的原因!網友:看完天都塌了!

夜深愛雜談
2026-02-07 19:05:55
伊朗革命衛隊確認海軍情報局高官身亡

伊朗革命衛隊確認海軍情報局高官身亡

新華社
2026-04-03 18:18:06
華中師范大學副校長周鵬程被查

華中師范大學副校長周鵬程被查

觀察者網
2026-04-03 17:38:07
入學時成績靠后,高考考上中山大學!他說:我從未上過補習班

入學時成績靠后,高考考上中山大學!他說:我從未上過補習班

南方都市報
2026-04-03 21:33:31
4月7日訪問大陸,能否見到最高層?鄭麗文用6個字回應,水平很高

4月7日訪問大陸,能否見到最高層?鄭麗文用6個字回應,水平很高

李健政觀察
2026-04-03 13:34:20
臺積電:我們已經顧不上美國工廠了,大陸再不給稀土,大家都得完

臺積電:我們已經顧不上美國工廠了,大陸再不給稀土,大家都得完

觸摸史跡
2026-04-03 21:47:03
特朗普嘲笑法國,總統挨老婆打,臉上還未痊愈,馬克龍已公開回應

特朗普嘲笑法國,總統挨老婆打,臉上還未痊愈,馬克龍已公開回應

興史興談
2026-04-04 02:56:16
中方暫停部分成品油,獨獨菲律賓越南照常發貨,背后算計太高!

中方暫停部分成品油,獨獨菲律賓越南照常發貨,背后算計太高!

共工之錨
2026-04-03 19:08:15
搭載1.5T混動系統 配備CDC魔毯懸架 長安CS75 PLUS HEV首發亮相

搭載1.5T混動系統 配備CDC魔毯懸架 長安CS75 PLUS HEV首發亮相

西莫的藝術宮殿
2026-04-02 15:09:26
生日照藏玄機,提離婚掀桌子,賭王家族“恩愛劇本”演不下去了

生日照藏玄機,提離婚掀桌子,賭王家族“恩愛劇本”演不下去了

天馬幸福的人生
2026-04-03 16:20:42
吉林大雪致琿烏高速發生事故,目擊者稱多車追尾 全省已有124個高速入口關閉

吉林大雪致琿烏高速發生事故,目擊者稱多車追尾 全省已有124個高速入口關閉

紅星新聞
2026-04-03 19:13:22
當著高市早苗的面,法國總統馬克龍承諾:不邀請中國參加G7峰會

當著高市早苗的面,法國總統馬克龍承諾:不邀請中國參加G7峰會

阿龍聊軍事
2026-04-02 18:59:10
重慶南岸喜來登酒店冒出濃濃煙霧,當地通報

重慶南岸喜來登酒店冒出濃濃煙霧,當地通報

黃河新聞網呂梁
2026-04-03 14:18:25
日本可能與中國開戰?日專家:與中國發生沖突,最長只能堅持一周

日本可能與中國開戰?日專家:與中國發生沖突,最長只能堅持一周

阿尢說歷史
2026-04-02 22:55:32
世界杯迎變局?意大利有望遞補參賽,意媒證實:規則根本不認排名

世界杯迎變局?意大利有望遞補參賽,意媒證實:規則根本不認排名

林子說事
2026-04-04 00:52:23
遇冷!4月轎車銷量完整版排名:燃油車惜敗,速騰第10,雷凌第74

遇冷!4月轎車銷量完整版排名:燃油車惜敗,速騰第10,雷凌第74

愛論歷史
2025-05-13 23:16:00
開局34連敗創歷史最差!四川遭吉林雙殺 賈昊25+7三分創新高

開局34連敗創歷史最差!四川遭吉林雙殺 賈昊25+7三分創新高

醉臥浮生
2026-04-03 21:15:27
有沒有人敢爆自己的瓜?網友:確定玩這么大嗎?

有沒有人敢爆自己的瓜?網友:確定玩這么大嗎?

夜深愛雜談
2026-02-18 20:55:58
為營救飛行員,美軍大批戰機飛入伊朗領空,雙方拼手速邊打邊找

為營救飛行員,美軍大批戰機飛入伊朗領空,雙方拼手速邊打邊找

三叔的裝備空間
2026-04-03 22:32:36
2026-04-04 03:56:49
開源中國 incentive-icons
開源中國
每天為開發者推送最新技術資訊
7667文章數 34520關注度
往期回顧 全部

科技要聞

5萬輛庫存車,給了特斯拉一記重拳

頭條要聞

伊朗:美飛行員跳傘在伊境內落地 美方曾試圖營救未果

頭條要聞

伊朗:美飛行員跳傘在伊境內落地 美方曾試圖營救未果

體育要聞

被NBA選中20年后,他重新回到籃球場

娛樂要聞

夏克立官宣再婚當爸?否認婚內出軌

財經要聞

專家稱長期攝入“飄香劑”存在健康隱患

汽車要聞

你介意和遠房親戚長得很像嗎?

態度原創

時尚
游戲
健康
藝術
手機

冬奧雙金夫妻:愛與榮耀,頂峰相見

三十年鐵律崩塌!主機漲價瘋魔 IGN警告行業"將死"

干細胞抗衰4大誤區,90%的人都中招

藝術要聞

她的作品藏著絕世美女,看看你能認出幾個!

手機要聞

OPPO Find X9 Ultra:真機偷跑!Find X9s Pro:要做小屏影像機皇

無障礙瀏覽 進入關懷版