關於數據庫壓縮技術

壓縮功能幾乎是當前主流數據庫的標配功能,除了能夠節省存儲空間外,在IO密集型的系統中, 可能也會帶來性能的提升。由於我們的存儲引擎也需要做記錄級壓縮的功能,所以很長的一段時間都在研究數據庫壓縮的技術,包括算法的選型及優化,當然這之前要對現有主流數據庫的壓縮功能做一些調研。 資料的來源比較分散,有手冊,論文,也有其他的網絡資料, 所以也未一一標出出處,如有疑問,歡迎提出。

DB2中行級壓縮的特性

  1. 在DB2中引入了一種叫Venom的技術,是基於字典的壓縮方法。其中字典存儲在一個內部數據結構中,並緩存起來以提高查詢的速度(Thedictionary for compression/decompression lookup is stored in hiddenobjects in the database, occupies little space, and is cached in memoryfor quick access)。
  2. DB2會有算法檢測如果對記錄進行壓縮是否會帶來空間的節約,如果不節約就不進行壓縮,估計是對部分數據進行採樣獲得(When compressinga large table, it may be useful to populate the table with a small setof "representative" or sample datafirst.)。對於新加入的記錄,還是繼續沿用老的採樣獲得的字典,但是提供REORG命令供重組字典並重新壓縮。
  3. 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.)
  4. 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.),這樣實現即使每次從內存中讀取記錄都要解壓縮一次。
  5. 寫入日誌的記錄數據也進行了壓縮(Thesize of database logs can also be reduced since DB2 compresses userdata within logrecords.)。

Oracle 11g中行級壓縮的特性:

  1. Oracle 11g引入的行級壓縮是發生在數據塊內的,每一個數據塊內建有一個symbol表,相當於壓縮字典。 在緩存中數據是以壓縮形式存在,這跟DB2是類似的, 可以增加緩存命中率, 減少IO從而提高性能。
  2. 發生更新,插入,刪除操作的時候,通過一個閥值控制是否進行壓縮。
  3. 使用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.)。
  4. 對讀操作沒有性能影響,但是對寫操作應該有一些影響,Oracle通過批處理解決(Oracle compresses blocks in batch mode rather than compressing dataevery time a write operation takesplace.),即當新初始化的塊中插入的記錄達到一定閥值後才進行壓縮,繼續往這一個塊中插入記錄,那麼都會進行重新壓縮以達到更高的壓縮比,這一步驟會重複直到檢測到再進行重新壓縮已經沒什麼好處了纔會不再進行。
  5. Oracle的段內壓縮比較適合用於更新比較少的應用,更適合OLAP而不適合OLTP,頻繁地更新可能會帶來比不壓縮更多的空間浪費,因爲頻繁地更新可能會導致記錄的遷移。

falcon中壓縮的特性:

  1. 如果某一列設了默認值,則不會在列中存儲默認值。
  2. buffer中緩存的是非壓縮的完整記錄;
  3. 記錄壓縮,準確地說應該是編碼,是採用一種密集的自描述結構,Nulls, zero length strings, and numbers -10 to 31只用一個字節表示;其他整型,取決於大小,可能需要1-8位的類型描述,所有的整型統一編碼;
  4. 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類型。

  1. 將對所有數據類型的 NULL 和 0 值進行優化,從而使它們不佔用任何字節。
  2. 減少了與記錄相關聯的元數據開銷。此元數據爲有關列、列長度和偏移量的信息。在某些情況下,元數據開銷可能大於舊的存儲格式。
  3. 對於數值類型(例如,integer、decimal 和 float)和基於數值的類型(例如,datetime 和 money)使用可變長度存儲格式。
  4. 通過使用不存儲空字符的可變長度格式來存儲定長字符串(刪除尾隨字符串)。
  5. 頁級壓縮是先採用前綴壓縮,再採用字典壓縮;在頁中添加新紀錄時不會馬上進行頁壓縮,只有當頁滿且有新記錄插入時才進行頁壓縮;
  6. 數據不是以固定大小的字節進行存儲,而是用最小所需的字節,只需要啓用行壓縮功能就可以執行。但是,行壓縮無法處理XML、BLOB和MAX數據類型;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章