導語: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);