天天看點

SQL Server 2008中的資料壓縮

SQL Server 2008中引入了資料壓縮的功能,允許在表、索引和分區中執行資料壓縮。這樣不僅可以大大節省磁盤的占用空間,還允許将更多資料頁裝入記憶體中,進而降低磁 盤IO,提升查詢的性能。當然,凡事有利有弊,在啟用資料壓縮後,資料庫伺服器就需要額外的CPU資源來進行壓縮處理。一般說來,資料庫伺服器的CPU占 用率不會太高,而磁盤IO容易成為瓶頸,是以在大多數情況下對大資料庫特别是資料倉庫啟用該項功能還是利大于弊。

SQL Server 2008的資料壓縮分為行壓縮和頁壓縮兩種。行壓縮主要是通過将固定長度類型存儲為可變長度類型來實作,同時還減少了與記錄相關聯的中繼資料開銷。頁壓縮在行壓縮的基礎上又增加了字首壓縮和字典壓縮,能獲得更大的壓縮率。

啟用資料庫壓縮隻需在建表語句後加入WITH (DATA_COMPRESSION = ROW)或是WITH (DATA_COMPRESSION =

PAGE)即可。如需将現有的索引修改為啟用壓縮,可通過ALTER INDEX index ON Table REBUILD WITH

(DATA_C0MPRESSION=ROW)或ALTER INDEX index ON Table REBUILD WITH

(DATA_C0MPRESSION=PAGE)實作。

最後提供一段簡單的用以判斷是否需要壓縮資料表的腳本,并自動生成壓縮腳本供系統管理者執

行。這裡用到未公開的存儲過程sp_MSforeachtable。在這段腳本中@precommand參數用于執行command指令執行前的SQL命

令,建立一張臨時表用于儲存資料表的資訊,@command1參數表示需要執行的SQL指令,對每一張表都利用sp_spaceused存儲過程擷取表的

磁盤占用資訊并儲存到建立的臨時表中,@postcommand參數用于執行command指令後的SQL指令,将之前建立的臨時表與系統關聯,根據設定

的條件(資料表占用空間大于10G)生成資料表壓縮腳本。

exec sp_MSforeachtable
@precommand=N'
create table ##(
id int identity,
name sysname,
rows int,
reserved Nvarchar(50),
data varchar(50),
indexdata varchar(50),
unused varchar(50))',
@command1=N'insert into ##(name,rows,reserved,data,indexdata,unused) exec sp_spaceused ''?''
update ## set data=SUBSTRING(data, 1, LEN(data) - 2) where id=scope_identity() AND LEN(data) >=2',
@postcommand=N'SELECT ''ALTER TABLE '' + TABLENAME + '' REBUILD WITH ( DATA_COMPRESSION = PAGE )'' FROM sys.tables A
JOIN
(SELECT C.name + ''.'' + A.name AS TABLENAME, object_id FROM ## A
JOIN sys.objects B
ON A.name = B.name
JOIN sys.schemas C
ON B.schema_id = C.schema_id
WHERE CAST(data AS int) > 10000000 AND object_id IN (SELECT object_id FROM sys.tables)) B
ON A.object_id = B.object_id AND type = ''U'';drop table ##'