DuckDB 1.5.5 修正十進位統計 min/max 顛倒與多起並行崩潰
DuckDB 官方部落格 · 2026-07-22
DuckDB 團隊釋出 1.5.5,是 1.5(代號 Variegata)系列的第六個修補版本,聚焦穩定性與效能,官方說明此版「同時包含錯誤修正、效能優化與安全性修補」。
核心改動
最值得注意的是一個正確性缺陷:128 位元 DECIMAL 型別在彙總統計(aggregate statistics)中的 min/max 計算被寫反了,這類問題不會讓查詢報錯,而是安靜地回傳錯誤結果,對財務或科學計算場景風險較高。此外修補了多個並行情境的崩潰,包括記憶體管理死結、並行 ALTER 與 INSERT 互相干擾,以及 external hash aggregate(資料量超出記憶體時落地磁碟的聚合運算)的當機問題。
- 修正 RLE(Run-Length Encoding)壓縮的資料完整性偵測誤判
- 修正
DROP COLUMN後欄位中繼資料記帳錯誤 - storage version 1.5.0 以上允許在更小的區塊大小使用 ALP 壓縮演算法,提升儲存效率
- ADBC 介面新增
duckdb://URI scheme 支援與 ADBC Statistics API
影響範圍
任何依賴 DECIMAL 聚合統計做查詢優化或報表的使用者都建議升級——這類統計資訊常被查詢規劃器用來決定執行計畫,一旦顛倒可能連帶影響效能判斷,而不只是顯示問題。
拆解 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