對于行存儲(相比列存儲)的表和索引,啟用數(shù)據(jù)壓縮最直接效果是能夠減小數(shù)據(jù)占用的存儲空間的大??;除了節(jié)省空間之外,數(shù)據(jù)壓縮還能提高 I/O 密集型查詢的性能,因為數(shù)據(jù)存儲在更少的數(shù)據(jù)頁(Data Page)中,SQL Server需要從磁盤讀取的數(shù)據(jù)頁更少,數(shù)據(jù)從Disk加載到內(nèi)存的速度更快,查詢的性能更好。但是,壓縮和解壓縮的過程都需要消耗額外的CPU資源,開發(fā)者必須均衡CPU資源,數(shù)據(jù)存儲和硬盤IO的開銷。

SQL Server提供兩種數(shù)據(jù)壓縮方式:行(Row)壓縮和頁壓縮(Page),用于壓縮表或索引數(shù)據(jù),數(shù)據(jù)壓縮對應用程序是透明的。

一,行壓縮

行壓縮(Row Compression)是將固定長度類型存儲為可變長度存儲類型,行壓縮是自動進行的,對應用程序不可見,應用程序不需要做任何修改。

1,對于字符型

Char(200),這是一個固定長度的數(shù)據(jù)類型,但是在實際存儲的時候,可能不會存儲200個字符。在物理存儲數(shù)據(jù)時,SQL Server后補空格以達到200個字符。如果將其轉換為varchar(200),不需要后補空格,節(jié)省存儲空間。

2,對于數(shù)值型

在SQL Server 2005 SP2之前,decimal類型總是以固定數(shù)據(jù)存儲的。根據(jù)值的精確度,每個decimal值都需要5到17字節(jié)的空間。新引入的Vardecimal存儲格式是把decimal值以一個可變長度的格式進行存儲。這種格式把小數(shù)值前后的零都去除,可以減少存儲所需的空間。

SOL Server 2008數(shù)據(jù)壓縮擴展了這個功能,對所有固定長度的數(shù)據(jù)類型都進行了處理,包括integer、char和float。現(xiàn)在數(shù)據(jù)不是以固定大小的字節(jié)進行存儲,而是用最小所需的字節(jié)。開發(fā)者不需要修改數(shù)據(jù)類型,只需要啟用行壓縮功能,SOL Server 2008及其之后的版本就會使用最小的可變數(shù)據(jù)類型來存儲數(shù)據(jù)。

3,行壓縮無法處理XML、BLOB和MAX數(shù)據(jù)類型

4,行壓縮的實現(xiàn) 

啟用行壓縮只會更改與數(shù)據(jù)類型相關聯(lián)的數(shù)據(jù)的物理存儲格式,將固定長度的類型修改為可變長度的類型進行存儲,而不會更改其語法或語義。新的記錄存儲格式主要有以下更改:

  • 減少了與記錄相關聯(lián)的元數(shù)據(jù)開銷。此元數(shù)據(jù)為有關列、列長度和偏移量的信息。在某些情況下,元數(shù)據(jù)開銷可能大于舊的存儲格式;

  • 它對于數(shù)值類型(例如,integer、decimal 和 float)和基于數(shù)值的類型(例如,datetime 和 money)使用可變長度存儲格式。 例如將decimal 修改為vardecimal;

  • 它通過使用不存儲空字符的可變長度格式來存儲定長字符串。例如,將char 修改為varchar;

實現(xiàn)的原理,通俗解釋是通過修改物理存儲格式,將定長類型轉換為變長類型,達到壓縮數(shù)據(jù)的目的,但是物理存儲格式的修改不會影響該字段使用的語法,例如: