導語:SQLServer2005SP2為我們帶來了vardecimal功能,這項功能使得原來定長的decimal資料在資料檔案中以可變長的格式存儲,據稱這項功能可為資料倉儲節省空間,而SQLServer2008在這基礎上增強了資料壓縮功能。
SQLServer中的資料壓縮功能,最早是從SQLServer2005開始,在企業版和開發版中增加了一種稱為vardecimal的新儲存格式,這透過該功能應用可以影響到decimal和numeric欄位。如果資料庫裡的表格含有decimal和numeric類型數據,使用者就可以使用vardecimal儲存格式來縮小資料庫的大小。值得注意的是,能夠節省多少空間取決於資料庫中含有多少decimal或numeric資料列、資料分佈情況以及表格的大小。
使用資料壓縮
而正是這個資料壓縮功能,成為SQLServer2008中另一個新特性:資料壓縮,利用這個特性,可以減少資料表,索引以及分割區的子集的大小。但這之前在SQLServer2005存在的功能,為何要在新一代版本系統中改進,在儲存成本不斷降低的市場環境下,資料壓縮技術能給企業何種好處?
儘管儲存成本不再是企業關注的敏感因素,但這並不代表資料庫尺寸不會對企業營運中效率有影響,因為資料庫尺寸除了會影響到儲存成本之外,還極大地關聯到管理成本和性能問題。
首先,因為資料庫需要備份,資料庫的尺寸越大,那麼備份時間就會越長,同時消耗的備份硬體成本提升,還有一種管理成本就是資料庫的維護成本。從效能方面,SQLServer在掃描磁碟讀取資料的時候都是按照資料頁為單位進行讀取的,因此如果一張資料頁中包含的資料行數越多,SQLServer在一次資料頁IO中獲得的數據就會越多,這樣也就帶來了效能的提升。
相對於SQL Server2005SP2中vardecimal的壓縮數據,SQLServer2008目前放出的測試數據,採用新的數據壓縮技術可以達到更高的存儲率,再加上企業對於容災而增加的存儲空間,所有的這些都是SQLServer2008中這一新特性有利一面。
第2頁:兩種壓縮模式
在了解壓縮資料真正好處之後,可以感受到概念的滲透,借助資料壓縮,減少了儲存成本,並提高查詢效能,減少I/O和增加緩衝點擊率。可見,這項功能在應用過程中還是十分有效果的,SQLServer2008中的資料壓縮有兩種應用方式,即行壓縮和頁壓縮,以下對這兩種資料壓縮類型簡單做個對比。
資料壓縮精靈過程中選擇壓縮類型
行壓縮。行壓縮可以將固定長度類型儲存為可變長度儲存類型。例如char(100)列儲存在一個可變長度儲存格式將只使用了儲存量所定義的資料。儲存的“SQLServer2008”,壓縮後只需要存放15個字符,而非全部100個字符,從而節省了85%的儲存空間。這是在SQLServer2005ServicePack2中提供的vardecimal儲存格式的想法的延伸。同時需要注意的是,這種壓縮模式,將對所有資料類型的NULL和0值進行最佳化,從而使它們不佔用任何位元組。
儘管SQLServer2008資料壓縮擴展了這個功能,對所有固定長度的資料類型都進行了處理,包括integer、char和float。現在資料不是以固定大小的位元組進行存儲,而是用最小所需的字節,只需要啟用行壓縮功能就可以執行。但是,行壓縮無法處理XML、BLOB和MAX資料類型。
頁面壓縮模式。這種壓縮功能,建立在行壓縮基礎之上,透過只儲存一次頁面上相同事件位元組來將儲存的冗餘資料減到最小。使用頁壓縮壓縮表和索引,除了採用行壓縮,還採用了前綴壓縮和字典壓縮。
資料壓縮會減少的大小您的表格或索引指標,最好是先評估壓縮後所能節省的空間。每一個頁都是單獨壓縮的,前綴和字典也儲存在頁內。由於頁是儲存分配的原子單位,將半頁壓縮到四分之一頁是沒有任何意義的,所以,只有在頁的內容快滿的時候才會開始壓縮處理。
在使用行和頁壓縮時還有一個效能權衡問題,因為CPU使用率會上升,但I/O使用率和記憶體佔用會下降。但這所有的壓縮選項可能成為SQLServer2008企業版專屬選項。
第3頁:如何使用資料壓縮
附錄(如何使用資料壓縮):
(1)啟用行壓縮
如果我們要在指定的表上啟用行壓縮,可執行下列語句:
CREATE TABLE Alpha(col1 int,col2 char(1000))
WITH (DATA_COMPRESSION = ROW)
(2)啟用頁壓縮
如果我們要在指定的分區上啟用壓縮,可執行以下語句:
CREATE TABLE Alpha_Partition(col1 int,col2 char(1000))
ON PartitionScheme(col 1)
WITH
(DATA_COMPRESSION = PAGE ON)
PARTITIONS(1-3)
(3)修改壓縮
如果要把一個現有的索引修改為使用壓縮,可執行以下語句:
ALTER INDEX Collndx ON Alpha REBUILD
WITH (DATA_C0MPRESSION=PAGE)
ALTER INDEX Collndx ON Alpha REBUILD
partition = 2
WITH (DATA_COMPRESSION=PAGE)
SQL Server 2008中的壓縮選項可以在建立資料表或索引時透過Option進行設置,例如:
CREATE TABLE TestTable (col1 int,col2varchar(200))WITH(DATA_COMPRESSION = ROW);
如果需要改變一個分區的壓縮選項,則可以用以下語句:
ALTER TABLE TestTable REBUILD PARTITION = 1 WITH(DATACOMPRESSION=PAGE);
如果需要為分割表的各個分割區設定不同的壓縮選項,可以使用以下的語句:(SQLServer2008可以對不同的分割區使用不同的壓縮選項,這點對於資料倉儲應用是非常重要的,因為資料倉儲的事實表通常都會有一個或數個熱分區,這些分區中的資料經常需要更新,為了避免資料壓縮給這些分區上的資料更新帶來額外的處理載荷,可以對這些分區關閉壓縮選項)
CREATE TABLE PartitionedTable (col1 int, col2varchar(200))
ON PS1 (col1)
WITH (DATA_COMPRESSION = ROW ON PARTITIONS(1),
DATA_COMPRESSION = PAGE ON PARTITION(2 TO 4));
如果是為某個索引設定壓縮選項的話,可以使用:
CREATE INDEX IX_TestTable_Col1 ONTestTable(Col1)WITH(DATA_COMPRESSION = ROW);
如果是修改某個索引的壓縮選項,可以使用:
ALTER INDEX IX_TestTable_Col1 ONTestTableREBUILDWITH(DATA_COMPRESSION = ROW);