淺談關(guān)系型數(shù)據(jù)庫(kù)中的壓縮技術(shù)
計(jì)算機(jī)存儲(chǔ)的容量限制仍然日益成為IT系統(tǒng)的瓶頸。其主要原因有兩個(gè):第一,信息革命導(dǎo)致人們產(chǎn)生了比過(guò)去多得多的數(shù)據(jù)。巨大的數(shù)據(jù)庫(kù)系統(tǒng)每時(shí)每刻都在產(chǎn)生海量的新數(shù)據(jù)。第二,隨著計(jì)算機(jī)存儲(chǔ)能力的增長(zhǎng),人們傾向于永久性保存所有的數(shù)據(jù)。例如,在信息革命早期,證券交易系統(tǒng)往往只保存近一段時(shí)間的交易細(xì)節(jié)數(shù)據(jù)。如今,人們傾向于保存所有能夠被保存的數(shù)據(jù):每一次交易,每一通電話(huà),網(wǎng)站的每一次點(diǎn)擊,交換機(jī)中的每一回通信等。
在這種趨勢(shì)下,計(jì)算機(jī)存儲(chǔ)承擔(dān)著越來(lái)越沉重的壓力。尤其是在企業(yè)級(jí)應(yīng)用中,為了保存海量數(shù)據(jù)而在存儲(chǔ)上投入的成本,往往已經(jīng)到了令人吃驚的地步。
在數(shù)據(jù)庫(kù)中使用壓縮技術(shù),是為了解決(或者至少緩解)這種壓力所做出的努力之一。這種技術(shù)的定義十分簡(jiǎn)單:對(duì)存儲(chǔ)在數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行壓縮,從而減少占用的磁盤(pán)空間,同時(shí)又盡量不影響數(shù)據(jù)庫(kù)的其他操作。
很容易想象這一技術(shù)產(chǎn)生的后果。被壓縮后的數(shù)據(jù)能夠顯著地減少占用的磁盤(pán)空間,從而降低整個(gè)系統(tǒng)的存儲(chǔ)成本。然而對(duì)數(shù)據(jù)進(jìn)行壓縮和解壓縮,需要更多的CPU時(shí)間。在對(duì)速度要求十分苛刻的數(shù)據(jù)庫(kù)系統(tǒng)中,這種CPU時(shí)間的額外支出,是否會(huì)導(dǎo)致效率的嚴(yán)重降低呢?
讓我們?nèi)娴貙徱晧嚎s技術(shù)引起的得失。在CPU時(shí)間上,會(huì)有額外的支出。但是,由于壓縮后的數(shù)據(jù)占用的磁盤(pán)空間減少了,這意味著系統(tǒng)用于I/O的時(shí)間也會(huì)相應(yīng)的減少。眾所周知,數(shù)據(jù)庫(kù)系統(tǒng)最大的瓶頸在于I/O:I/O速度的增長(zhǎng)卻遠(yuǎn)遠(yuǎn)跟不上CPU按照摩爾定律的增長(zhǎng)。因此,從CPU時(shí)間上支出的成本,可以在I/O速度的提高上補(bǔ)償回來(lái),而且還可能有盈余。壓縮后的數(shù)據(jù)庫(kù),不但會(huì)占用更少的磁盤(pán)空間,甚至還可能有更快的速度。
然而在實(shí)際項(xiàng)目中,還要考慮到多種因素的權(quán)衡,情況可能會(huì)非常復(fù)雜。幸運(yùn)的是,主流的幾種關(guān)系數(shù)據(jù)庫(kù)在實(shí)踐中都已經(jīng)正式支持壓縮技術(shù)。目前,數(shù)據(jù)庫(kù)壓縮技術(shù)主要仍然被應(yīng)用于數(shù)據(jù)密集型的OLAP,而不是運(yùn)算密集型的OLTP,但這并不意味著它不能被應(yīng)用于OLTP。
壓縮方式
目前,幾乎所有的關(guān)系型數(shù)據(jù)庫(kù)中應(yīng)用的壓縮方式,都是基于字典的壓縮方式。基本原理是,將數(shù)據(jù)中重復(fù)出現(xiàn)的信息抽取出來(lái),并用比較簡(jiǎn)短的符號(hào)予以代替,從而達(dá)到壓縮的效果。舉例來(lái)說(shuō),如果數(shù)據(jù)中重復(fù)出現(xiàn)了“Personal Computer”這個(gè)字符串,那么它就會(huì)被識(shí)別為一個(gè)模式(Pattern),然后所有這個(gè)字符串出現(xiàn)的地方都會(huì)被一個(gè)對(duì)應(yīng)的符號(hào)(Symbol)代替,比如數(shù)字1。所有的模式和對(duì)應(yīng)的符號(hào)都會(huì)被存儲(chǔ)在字典里面(Dictionary),字典被用于壓縮和解壓縮(也就是對(duì)Pattern和Symbol進(jìn)行相互替換)。當(dāng)然,真實(shí)的應(yīng)用比這要復(fù)雜得多。但是,理解了字典壓縮的原理以后,我們已經(jīng)可以從不同的角度對(duì)不同的壓縮技術(shù)進(jìn)行區(qū)分。
- 按建立字典的方式區(qū)分:手工建立字典和自動(dòng)建立字典。手工建立字典,意味著數(shù)據(jù)庫(kù)不能自動(dòng)搜索數(shù)據(jù)中的重復(fù)數(shù)據(jù),必須人工輸入所有的模式才能建立字典。這種方式出現(xiàn)在數(shù)據(jù)庫(kù)壓縮技術(shù)的早期,目前已經(jīng)基本被淘汰。自動(dòng)建立字典則意味著數(shù)據(jù)庫(kù)會(huì)自動(dòng)搜索模式而無(wú)需人工干預(yù)。
- 按字典應(yīng)用的范圍區(qū)分:表級(jí)別的字典和塊級(jí)別的字典。表級(jí)別的字典意味著在整個(gè)表的范圍內(nèi)搜索模式并建立一個(gè)唯一的字典,而塊級(jí)別的字典則在每一個(gè)塊上建立單獨(dú)的字典。其中,塊是關(guān)系型數(shù)據(jù)庫(kù)中的一個(gè)術(shù)語(yǔ),是存儲(chǔ)的最小單位。
- 按存儲(chǔ)的方式區(qū)分:列壓縮和行壓縮。這涉及列存儲(chǔ)和行存儲(chǔ)的概念。行存儲(chǔ)表示數(shù)據(jù)庫(kù)中包含不同字段的同一行被連續(xù)存放。列存儲(chǔ)則表示包含不同行的同一字段數(shù)據(jù)被連續(xù)存放。同一字段的數(shù)據(jù)出現(xiàn)重復(fù)的可能性較大,這意味著基于列的壓縮可能有更高的效率,但這和傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)的存儲(chǔ)方式相悖。由于二者互有利弊,數(shù)據(jù)庫(kù)廠(chǎng)商往往通過(guò)一些技巧來(lái)避免其缺陷,使之適應(yīng)實(shí)際使用,甚至混合使用這兩種壓縮方式。
壓縮相關(guān)的操作
雖然關(guān)系型數(shù)據(jù)庫(kù)使用的壓縮算法本身不太復(fù)雜,但是由于壓縮技術(shù)改變了數(shù)據(jù)存儲(chǔ)的底層結(jié)構(gòu),因此涉及數(shù)據(jù)庫(kù)操作的方方面面。下面是一些主要的相關(guān)操作:
- 數(shù)據(jù)查詢(xún)。當(dāng)接收到查詢(xún)請(qǐng)求時(shí),數(shù)據(jù)庫(kù)系統(tǒng)從磁盤(pán)中讀取已被壓縮的數(shù)據(jù),必須先經(jīng)過(guò)一個(gè)解壓的過(guò)程,將數(shù)據(jù)還原為未壓縮的形式,再返回給查詢(xún)請(qǐng)求。
- 數(shù)據(jù)更新。當(dāng)進(jìn)行Insert和Update操作時(shí),數(shù)據(jù)需要經(jīng)過(guò)壓縮之后才被存儲(chǔ)。理論上來(lái)說(shuō),Delete操作只需要簡(jiǎn)單地刪除數(shù)據(jù),而無(wú)需進(jìn)行壓縮或解壓縮。但是事實(shí)上,在某些自適應(yīng)的壓縮技術(shù)中,對(duì)已有數(shù)據(jù)的更新到達(dá)某一閾值時(shí),會(huì)導(dǎo)致字典的自動(dòng)更新(因?yàn)樽值湟呀?jīng)不能再適應(yīng)當(dāng)前的數(shù)據(jù))。這意味著,IUD操作都有可能導(dǎo)致字典的重新創(chuàng)建(或刪除)。
- 數(shù)據(jù)裝載。這和插入數(shù)據(jù)的過(guò)程類(lèi)似,數(shù)據(jù)將會(huì)先被壓縮然后被存儲(chǔ)。在某些情況下(例如,當(dāng)DB2的Automatic Dictionary Creation技術(shù)被啟用時(shí)),裝載數(shù)據(jù)時(shí)還可能同時(shí)創(chuàng)建字典。
- 表整理。在整理表時(shí),根據(jù)當(dāng)前表被標(biāo)識(shí)為壓縮或未壓縮,將會(huì)對(duì)數(shù)據(jù)進(jìn)行相應(yīng)的壓縮或者解壓縮處理。表整理是對(duì)整個(gè)表進(jìn)行充分壓縮的有效手段。
- 壓縮率評(píng)估。數(shù)據(jù)庫(kù)一般會(huì)提供一個(gè)操作,在未被壓縮(或未被完全壓縮)的數(shù)據(jù)表上進(jìn)行評(píng)估,預(yù)測(cè)能達(dá)到多高的壓縮率。
- 索引(Index)壓縮。索引壓縮的算法與關(guān)系型數(shù)據(jù)壓縮不太一樣,本文不進(jìn)行深入討論。
- 大對(duì)象(LOB)壓縮。大對(duì)象不使用關(guān)系型數(shù)據(jù)的行存儲(chǔ)或列存儲(chǔ)方式,因此也不適用上述的算法。
- 日志(Log)。日志中需要保存和壓縮操作相關(guān)的信息,以保證數(shù)據(jù)的一致性。
- 備份與恢復(fù)。在備份與恢復(fù)操作時(shí),需要進(jìn)行相應(yīng)的數(shù)據(jù)壓縮和解壓縮處理。
#p#
壓縮相關(guān)的命令
雖然壓縮涉及非常復(fù)雜的數(shù)據(jù)庫(kù)內(nèi)部機(jī)制,但理論上來(lái)說(shuō),壓縮后的數(shù)據(jù)庫(kù)對(duì)于使用者是透明的,所有的壓縮和解壓縮過(guò)程都隱藏在數(shù)據(jù)庫(kù)內(nèi)部。因此,在絕大部分情況下,使用者不需要進(jìn)行額外的操作,甚至不需要知道數(shù)據(jù)庫(kù)是否已經(jīng)被壓縮過(guò)。
當(dāng)然,仍然有一些與特定的壓縮相關(guān)的數(shù)據(jù)庫(kù)命令。下面以DB2 V9.7為例,作一簡(jiǎn)單討論。
當(dāng)創(chuàng)建一個(gè)表的時(shí)候,可指定該表使用壓縮。語(yǔ)法如下:
- CREATE TABLE CUSTOMER (
- …
- ) COMPRESS YES;
這條命令創(chuàng)建了一個(gè)名為CUSTOMER的表,并且在此表上使用壓縮功能。以后在此表上進(jìn)行的查詢(xún)、插入、更新等操作,都會(huì)自動(dòng)在后臺(tái)執(zhí)行相應(yīng)的壓縮和解壓縮操作,而不需要使用特殊的語(yǔ)法。
對(duì)于一個(gè)已經(jīng)存在的表,可以用ALTER TABLE命令來(lái)啟用或停止其壓縮功能:
ALTER TABLE CUSTOMER COMPRESS YES;
這條命令會(huì)在已存在的表CUSTOMER上啟用壓縮功能。
ALTER TABLE CUSTOMER COMPRESS ON;
則會(huì)關(guān)閉壓縮功能。
需要注意的是,使用ALTER TABLE命令啟用或停止其壓縮功能后,并不會(huì)對(duì)已經(jīng)存在的記錄生效。舉例來(lái)說(shuō),在對(duì)某個(gè)表啟動(dòng)壓縮后,新插入的(包括被批量load的)記錄以及被更新的記錄都會(huì)以被壓縮的格式保存,但是,對(duì)于那些已經(jīng)存在、并且沒(méi)有在壓縮功能啟用后被更新過(guò)的記錄,它們?nèi)匀灰栽嫉母袷奖4妗_@說(shuō)明了為什么在啟用壓縮以后,數(shù)據(jù)庫(kù)占有的磁盤(pán)空間并沒(méi)有立即減少。
那么,怎樣使壓縮功能對(duì)于已經(jīng)存在的記錄也生效呢?答案是使用REORG整理整個(gè)表。如上例,在執(zhí)行完ALTER TABLE命令以后,立即執(zhí)行以下命令:
REORG TABLE CUSTOMER;
這條命令將掃描整個(gè)CUSTOMER表,并對(duì)所有的記錄都進(jìn)行壓縮或解壓縮。根據(jù)表的大小,可能會(huì)執(zhí)行相當(dāng)長(zhǎng)的時(shí)間。
壓縮率
即使在相同的壓縮算法下,表的壓縮率也是不固定的。與常規(guī)的文件壓縮相比,表的壓縮率取決于更多的因素。
數(shù)據(jù)冗余度。數(shù)據(jù)庫(kù)壓縮的前提是被壓縮的數(shù)據(jù)是冗余的。對(duì)于冗余度大的數(shù)據(jù),往往能得到很好的壓縮率。而對(duì)于冗余度很小甚至趨近于0的數(shù)據(jù),再好的壓縮算法也無(wú)濟(jì)于事。不同數(shù)據(jù)庫(kù)的冗余度差別是非常大的。
數(shù)據(jù)分布。某些類(lèi)型的壓縮算法會(huì)在一個(gè)小范圍內(nèi)構(gòu)建壓縮字典。這意味在某個(gè)較小的范圍內(nèi),如果可以找到較多的Pattern,就可以獲得較高的壓縮率。如果Pattern是均勻分布在整個(gè)表中的,那么小范圍內(nèi)的字典將效率很低。在表的某些列上建立聚集索引,強(qiáng)制使內(nèi)容相似的行處于相鄰的位置,往往是提高壓縮率的一種有效方式。
數(shù)據(jù)庫(kù)群集。在群集的情況下,由于字典無(wú)法跨越群集,因此必須盡量使單一節(jié)點(diǎn)上的數(shù)據(jù)冗余度盡可能地高。對(duì)于DB2來(lái)說(shuō),精心設(shè)計(jì)DPF中的Hash Columns,以及配合使用聚集索引,能夠有效地影響到壓縮率。
某些基于真實(shí)應(yīng)用的數(shù)據(jù)庫(kù)的測(cè)試表明,壓縮技術(shù)往往可以將數(shù)據(jù)庫(kù)的大小減少70%甚至更多,同時(shí)對(duì)系統(tǒng)的整體性能沒(méi)有明顯的影響(在I/O密集的系統(tǒng)中,系統(tǒng)性能甚至可能提高)。當(dāng)然,這個(gè)測(cè)試結(jié)果僅供參考,因?yàn)閷?shí)際的表現(xiàn)依賴(lài)于數(shù)據(jù)庫(kù)的具體情況。
結(jié)論
前面探討了關(guān)于數(shù)據(jù)庫(kù)可用性和擴(kuò)展性方面的問(wèn)題,我們看到每種產(chǎn)品和架構(gòu)都是有缺陷的,其實(shí)架構(gòu)就是有所取舍的過(guò)程,目標(biāo)是用最小的代價(jià)去解決問(wèn)題。所以找到適合自己的產(chǎn)品和架構(gòu),這才是最重要的。
原文鏈接:http://www.cnblogs.com/aooyu/archive/2011/06/07/2074320.html
【編者推薦】