SQL Server 2005 SP2為我們帶來了vardecimal功能,這項功能使得原來定長的decimal數據在數據文件中以可變長的格式存儲,據稱這項功能可以為典型的數據倉庫節省30%的空間,而SQL Server 2008在這一基礎上又進一步增強了數據壓縮功能。SQL Server 2008現在支持行壓縮和頁面壓縮兩種選項,數據壓縮選項可以在以下對象上啟用:
未創建聚簇索引的表
創建聚簇索引的表
非聚簇索引(對表設置壓縮選項不會影響到該表上的非聚簇索引,因此聚簇索引的壓縮需要單獨設置)
索引視圖
分區表和分區索引中的單個分區
為什麼需要數據壓縮
首先可能需要討論的問題就是為什麼在存儲成本不斷降低的今天,微軟還要煞費苦心地在SQL Server中實現並且不斷改進數據壓縮技術呢?
盡管存儲成本已經不再是傳統意義上的首要考慮因素,但是這並不代表數據庫尺寸不是一個問題,因為數據庫尺寸除了會影響到存儲成本之外,還極大地關聯到管理成本和性能問題。
首先我們來討論為什麼會有管理成本的問題?因為數據庫需要備份,數據庫的尺寸越大,那麼備份時間就會越長,當然另外一點就是消耗的備份硬件成本也會隨之提高(包括需要的備份介質成本和為了滿足備份窗口而需要更高級的備份設備帶來的采購成本),還有一種管理成本就是數據庫的維護成本,例如我們經常需要完成的DBCC任務,數據庫尺寸越大,我們就需要更多的時間來完成這些任務。
接著我們再看看性能問題。SQL Server在掃描磁盤讀取數據的時候都是按照數據頁為單位進行讀取的,因此如果一張數據頁中包含的數據行數越多,SQL Server在一次數據頁IO中獲得的數據就會越多,這樣也就帶來了性能的提升。
最後考慮存儲的成本,按照原先SQL Server 2005 SP2中vardecimal的壓縮數據為例,30%的空間節省也就意味著30%的存儲成本,而按照SQL Server 2008當前放出的測試數據,采用新的數據壓縮技術可以達到2X-7X的存儲率,再加上如果企業要考慮容災而增加的存儲空間,這樣節省的存儲硬件成本也將是想當可觀的。
如何使用數據壓縮
SQL Server 2008中的壓縮選項可以在創建表或索引時通過Option進行設置,例如:CREATE TABLE TestTable (col1 int, col2 varchar(200)) WITH (DATA_COMPRESSION = ROW);
如果需要改變一個分區的壓縮選項,則可以用以下語句:ALTER TABLE TestTable REBUILD PARTITION = 1 WITH (DATA COMPRESSION = PAGE);
如果需要為分區表的各個分區設置不同的壓縮選項,可以使用以下的語句:(SQL Server 2008可以對不同的分區使用不同的壓縮選項,這一點對於數據倉庫應用是非常重要的,因為數據倉庫的事實表通常都會有一個或數個熱分區,這些分區中的數據經常需要更新,為了避免數據壓縮給這些分區上的數據更新帶來額外的處理載荷,可以對這些分區關閉壓縮選項)CREATE TABLE PartitionedTable (col1 int, col2 varchar(200))
ON PS1 (col1)
WITH (
DATA_COMPRESSION = ROW ON PARTITIONS(1),
DATA_COMPRESSION = PAGE ON PARTITION(2 TO 4));
如果是為某個索引設置壓縮選項的話,可以使用:
CREATE INDEX IX_TestTable_Col1 ON TestTable (Col1) WITH (DATA_COMPRESSION = ROW);
如果是修改某個索引的壓縮選項,可以使用:ALTER INDEX IX_TestTable_Col1 ON TestTable REBUILD WITH (DATA_COMPRESSION = ROW);
SQL Server 2008同時還提供了一個名為sp_estimate_data_compression_savings存儲過程幫助DBA估計激活壓縮選項後對象尺寸。