關於資料庫壓縮技術的Survey

yzf01發表於2021-09-09

昨天給團隊內的小夥伴做了一個關於資料庫壓縮技術的Survey,現將其中可以公開的部分分享出來。資料庫壓縮技術目前已經成為了各種資料庫的標配技術,這裡麵包括三大商業資料庫、各種專業的分新型資料庫,也包括各種開源資料庫和NoSQL資料庫。

到了今天,資料庫壓縮技術的運用已經不單純是為了節省儲存成本,更多的時候,是為了提供更高的計算密度(比如容量受限的SSD),以及提供更高的查詢效能(OLAP)。對於壓縮的有利因素,一些公共的認知是:列比行更有利於壓縮,更大的輸入、有序的輸入更有利於壓縮。

不同資料庫對於壓縮粒度的選擇也千差萬別,大多數資料庫使用塊作為壓縮的基本單位,少數資料庫會提供欄位級的壓縮,但也有一些資料庫使用表、甚至整個庫作為壓縮的基本單位。很明顯,壓縮粒度越粗,對系統的可用性影響越大,表級以上的壓縮粒度通常不再被認為是資料庫本身支援了壓縮技術。

除了壓縮粒度之外,儲存格式的選擇對應用場景也比較重要,比如行存適合於寬查詢(訪問少數行和多數列),面向投影最佳化(OLTP);而列存適合於窄查詢(訪問多數行和少數列),面向Filter最佳化(OLAP);兩者的混合體是所謂的塊內按列壓縮,塊間按行組織,即行列混合儲存(PAX),典型的代表是ORACLE EXADA他的HCC。

雖然是一種標配,但不同資料庫對於資料庫壓縮技術的實現幾乎各不相同,但總體上可以分為三個層次:1)Packing,比如消除小整數的前端0,消除CHAR的尾部空格等,這類壓縮技術通常發生在OLTP系統中,粒度通常為欄位級別,系統通常會提供正常和緊縮的兩種儲存格式;2)Encoding,也就是規則壓縮,典型的方法包括字典、RLE、字首、差值等,相關技術的細節,在參考資料裡有詳細的論述;3)Compression,也就是後端壓縮,即直接使用通用的壓縮演算法,比如Snappy、Zlib、BZip等。

所有商業資料庫和專業的分析型資料庫都會引入不同的Encoding方法,而不會直接使用Compression。道理很簡單,首先,Encode比Compression更懂資料,因為Compression總是把資料看成連續的位元組流,而Encoding知道每個欄位的邊界、型別和值域特徵,所以Encoding+Compression會比僅使用Compression能提供更高的壓縮率;第二,Encoding會提供更高的解碼速度,因為哪怕是最快的Snappy,也需要把資料完全解壓後才可查詢,而大多數Encoding方法不需要解碼即可查詢;最後,Encoding會提供合理的編碼速度,雖然比不過Snappy,但會遠超Zlib、Bzip這樣的對手。

下面給出一個資料庫壓縮技術的Survey:

圖片描述圖片描述

以下給出一些資料庫壓縮技術有用的連結:

圖片描述

原文連結:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2334/viewspace-2805609/,如需轉載,請註明出處,否則將追究法律責任。

相關文章