關於資料庫壓縮技術
阿新 • • 發佈:2018-11-06
壓縮功能幾乎是當前主流資料庫的標配功能,除了能夠節省儲存空間外,在IO密集型的系統中, 可能也會帶來效能的提升。由於我們的儲存引擎也需要做記錄級壓縮的功能,所以很長的一段時間都在研究資料庫壓縮的技術,包括演算法的選型及優化,當然這之前要對現有主流資料庫的壓縮功能做一些調研。 資料的來源比較分散,有手冊,論文,也有其他的網路資料, 所以也未一一標出出處,如有疑問,歡迎提出。
DB2中行級壓縮的特性
- 在DB2中引入了一種叫Venom的技術,是基於字典的壓縮方法。其中字典儲存在一個內部資料結構中,並快取起來以提高查詢的速度(Thedictionary for compression/decompression lookup is stored in hiddenobjects in the database, occupies little space, and is cached in memoryfor quick access)。
- DB2會有演算法檢測如果對記錄進行壓縮是否會帶來空間的節約,如果不節約就不進行壓縮,估計是對部分資料進行取樣獲得(When compressinga large table, it may be useful to populate the table with a small setof "representative" or sample datafirst.)。對於新加入的記錄,還是繼續沿用老的取樣獲得的字典,但是提供REORG命令供重組字典並重新壓縮。
- DB2採用的是不同於Oracle的全域性字典,而不是頁內建字典(By building a compression dictionaryat the table rather than page level, patterns across the entire tableare analyzed, generally resulting in improved disk savings with DB2.)
- DB2中快取在Buffer中的資料也是壓縮格式的(Furthermore, DB2 keeps the data compressed onboth disk and memory (DB2 buffer pools), thereby reducing the amount ofmemory consumed, and freeing it up for other database or systemoperations.),這樣實現即使每次從記憶體中讀取記錄都要解壓縮一次。
- 寫入日誌的記錄資料也進行了壓縮(Thesize of database logs can also be reduced since DB2 compresses userdata within logrecords.)。
Oracle 11g中行級壓縮的特性:
- Oracle 11g引入的行級壓縮是發生在資料塊內的,每一個數據塊內建有一個symbol表,相當於壓縮字典。 在快取中資料是以壓縮形式存在,這跟DB2是類似的, 可以增加快取命中率, 減少IO從而提高效能。
- 發生更新,插入,刪除操作的時候,通過一個閥值控制是否進行壓縮。
- 使用ALTER TABLE線上更改表模式指定壓縮時只對後面新插入的記錄生效,原有記錄不會被壓縮(You can alter thecompression attribute for a table (or a partition or tablespace), andthe change only applies to new data going into thattable)。但是可以通過命令把原紀錄也變成壓縮格式(Existing data in the database can also becompressed by moving it into compressed form through ALTER TABLE andMOVE statements.)。
- 對讀操作沒有效能影響,但是對寫操作應該有一些影響,Oracle通過批處理解決(Oracle compresses blocks in batch mode rather than compressing dataevery time a write operation takesplace.),即當新初始化的塊中插入的記錄達到一定閥值後才進行壓縮,繼續往這一個塊中插入記錄,那麼都會進行重新壓縮以達到更高的壓縮比,這一步驟會重複直到檢測到再進行重新壓縮已經沒什麼好處了才會不再進行。
- Oracle的段內壓縮比較適合用於更新比較少的應用,更適合OLAP而不適合OLTP,頻繁地更新可能會帶來比不壓縮更多的空間浪費,因為頻繁地更新可能會導致記錄的遷移。
falcon中壓縮的特性:
- 如果某一列設了預設值,則不會在列中儲存預設值。
- buffer中快取的是非壓縮的完整記錄;
- 記錄壓縮,準確地說應該是編碼,是採用一種密集的自描述結構,Nulls, zero length strings, and numbers -10 to 31只用一個位元組表示;其他整型,取決於大小,可能需要1-8位的型別描述,所有的整型統一編碼;
- using only as many bytes for integer as it requires, not storing column value if it is default
關於falcon中的資料壓縮包括官方文件在內的資料中介紹得很少,事實上其功能應該相對比較簡單,壓縮比也不大,Jim Starkey本人稱其為'encoding',而不是'compression'。
SQL Server 2008壓縮特性
SQL Server似乎是2008之後才引入的壓縮的功能,是採用行級壓縮和頁級壓縮相結合的方法。其中行級壓縮主要針對整型以及char型別。
- 將對所有資料型別的 NULL 和 0 值進行優化,從而使它們不佔用任何位元組。
- 減少了與記錄相關聯的元資料開銷。此元資料為有關列、列長度和偏移量的資訊。在某些情況下,元資料開銷可能大於舊的儲存格式。
- 對於數值型別(例如,integer、decimal 和 float)和基於數值的型別(例如,datetime 和 money)使用可變長度儲存格式。
- 通過使用不儲存空字元的可變長度格式來儲存定長字串(刪除尾隨字串)。
- 頁級壓縮是先採用字首壓縮,再採用字典壓縮;在頁中新增新紀錄時不會馬上進行頁壓縮,只有當頁滿且有新記錄插入時才進行頁壓縮;
- 資料不是以固定大小的位元組進行儲存,而是用最小所需的位元組,只需要啟用行壓縮功能就可以執行。但是,行壓縮無法處理XML、BLOB和MAX資料型別;