資料與儲存 2026 年 7 月 24 日

2026-07-24 — DuckDB 1.5.5 修正 DECIMAL 統計顛倒與多起崩潰、拆解 RocksDB 的 MVCC 事務機制

primary=https://duckdb.org/2026/07/22/announcing-duckdb-155.html primary=https://artem.krylysov.com/blog/2026/07/23/how-mvcc-and-transactions-work-in-rocksdb/

DuckDB 1.5.5 修正十進位統計 min/max 顛倒與多起並行崩潰

DuckDB 官方部落格 · 2026-07-22

DuckDB 團隊釋出 1.5.5,是 1.5(代號 Variegata)系列的第六個修補版本,聚焦穩定性與效能,官方說明此版「同時包含錯誤修正、效能優化與安全性修補」。

核心改動

最值得注意的是一個正確性缺陷:128 位元 DECIMAL 型別在彙總統計(aggregate statistics)中的 min/max 計算被寫反了,這類問題不會讓查詢報錯,而是安靜地回傳錯誤結果,對財務或科學計算場景風險較高。此外修補了多個並行情境的崩潰,包括記憶體管理死結、並行 ALTERINSERT 互相干擾,以及 external hash aggregate(資料量超出記憶體時落地磁碟的聚合運算)的當機問題。

  • 修正 RLE(Run-Length Encoding)壓縮的資料完整性偵測誤判
  • 修正 DROP COLUMN 後欄位中繼資料記帳錯誤
  • storage version 1.5.0 以上允許在更小的區塊大小使用 ALP 壓縮演算法,提升儲存效率
  • ADBC 介面新增 duckdb:// URI scheme 支援與 ADBC Statistics API

影響範圍

任何依賴 DECIMAL 聚合統計做查詢優化或報表的使用者都建議升級——這類統計資訊常被查詢規劃器用來決定執行計畫,一旦顛倒可能連帶影響效能判斷,而不只是顯示問題。

原始來源:DuckDB: Announcing DuckDB 1.5.5


拆解 RocksDB 的 MVCC:序號三元組、跳躍表與雙軌事務模式

Artem Krylysov 部落格 · 2026-07-23

一篇技術部落格詳細拆解了 RocksDB 如何用多版本並行控制(MVCC)讓讀寫互不阻塞:寫入者永遠產生新版本而非原地修改,讀取者則看到查詢開始那一刻的一致快照。

核心改動

RocksDB 為每次寫入分配單調遞增的序號,每筆儲存的資料實際上是一個 (user_key, sequence_number, value_type) 三元組。系統同時追蹤「最後配置序號」與「已發佈序號」兩個游標,讀取路徑靠比對序號跳過還沒對外可見的新版本。資料在 memtable 中以跳躍表(skip list)組織,先按 key 遞增排序、再按序號遞減排序,讓無鎖的並行讀寫能維持 O(log n) 平均搜尋複雜度。

快照(snapshot)機制讓多個讀取請求釘住同一個序號,compaction 只要看到還有存活快照引用某個版本就不會清除它;SuperVersion 則是一個引用計數結構,追蹤目前的 memtable、不可變 memtable 與 SST 檔案,避免讀取過程中結構被提前釋放。批次寫入的原子性則靠「先統一配置序號、寫入完成才發佈」達成。

影響範圍

RocksDB 提供悲觀(pessimistic)與樂觀(optimistic)兩種事務模式:悲觀模式在寫入當下就鎖 key、衝突立即偵測並可能逾時阻塞;樂觀模式寫入不上鎖,靠 100 萬把預先配置好的 mutex 把衝突檢查延後到 commit 時才做。這套機制正是 MyRocks(MySQL 的 RocksDB 儲存引擎)與 ArangoDB 等系統事務層的底層依據。

原始來源:Artem Krylysov: How MVCC and Transactions Work in RocksDB


End of article
0
Would love your thoughts, please comment.x
()
x