表和索引的行壓縮和頁壓縮
SQL Server 2008 支持表和索引的行壓縮和頁壓縮。可以爲以下數據庫對象配置數據壓縮:
- 存儲爲堆的整個表。
- 存儲爲聚集索引的整個表。
- 整個非聚集索引。
- 整個索引視圖。
- 對於已分區表和已分區索引,可爲每個分區配置壓縮選項,且對象的各個分區的壓縮設置不必相同。
表的壓縮設置不自動應用於它的非聚集索引。必須單獨設置每個索引。壓縮功能不可用於系統表。如果表和索引是使用 CREATE TABLE 和 CREATE INDEX 語句創建的,則可以壓縮。若要更改表、索引或分區的壓縮狀態,請使用 ALTER TABLE 或 ALTER INDEX 語句。
估算壓縮後的節省量
若要確定更改壓縮狀態對錶或索引的影響,可使用 sp_estimate_data_compression_savings 存儲過程。sp_estimate_data_compression_savings 存儲過程僅在 SQL Server 的支持數據壓縮的版本中可用。
啓動數據壓縮嚮導
-
在對象資源管理器中,右鍵單擊一個表、索引或索引視圖,指向“存儲”,然後單擊“壓縮”。
監視壓縮
若要監視 SQL Server 的整個實例的壓縮,請使用 SQL Server Access Methods 對象的 Page compression attempts/sec 和 Pages compressed/sec 計數器。
若要獲取各個分區的頁壓縮統計信息,請查詢 sys.dm_db_index_operational_stats 動態管理函數。
示例
下面的一些示例使用已分區表,並需要具有文件組的數據庫。若要創建具有文件組的數據庫,請執行以下語句。
CREATE DATABASE TestDatabase ON PRIMARY ( NAME = TestDatabase, FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Data\TestDB.mdf'), FILEGROUP test1fg ( NAME = TestDBFile1, FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Data\TestDBFile1.mdf'), FILEGROUP test2fg ( NAME = TestDBFile2, FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Data\TestDBFile2.ndf'), FILEGROUP test3fg ( NAME = TestDBFile3, FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Data\TestDBFile3.ndf'), FILEGROUP test4fg ( NAME = TestDBFile4, FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Data\TestDBFile4.ndf') ; GO |
若要切換到新數據庫,請執行以下操作:
USE TestDatabase GO |
A. 創建使用行壓縮的表
下面的示例創建一個表並將壓縮設置爲 ROW
。
CREATE TABLE T1 (c1 int, c2 nvarchar(50) ) WITH (DATA_COMPRESSION = ROW); GO |
B. 創建使用頁壓縮的表
下面的示例創建一個表並將壓縮設置爲 PAGE
。
CREATE TABLE T2 (c1 int, c2 nvarchar(50) ) WITH (DATA_COMPRESSION = PAGE); GO |
C. 對已分區表設置 DATA_COMPRESSION 選項
下例使用 TestDatabase
表,該表是通過使用本部分前面提供的代碼創建的。該示例創建一個分區函數和方案,然後創建一個已分區表併爲該表的分區指定壓縮選項。在本示例中,分區
1
配置爲 ROW
壓縮,餘下的分區配置爲 PAGE
壓縮。
若要創建分區函數,請執行以下操作:
CREATE PARTITION FUNCTION myRangePF1 (int) AS RANGE LEFT FOR VALUES (1, 100, 1000) ; GO |
若要創建分區方案,請執行以下操作:
CREATE PARTITION SCHEME myRangePS1 AS PARTITION myRangePF1 TO (test1fg, test2fg, test3fg, test4fg) ; GO |
若要創建具有已壓縮分區的已分區表,請執行以下操作:
CREATE TABLE PartitionTable1 (col1 int, col2 varchar(max)) ON myRangePS1 (col1) WITH ( DATA_COMPRESSION = ROW ON PARTITIONS (1), DATA_COMPRESSION = PAGE ON PARTITIONS (2 TO 4) ); GO |
D. 對已分區表設置 DATA_COMPRESSION 選項
下面的示例使用示例 C 中使用的數據庫。該示例使用用於非連續分區的語法來創建表。
CREATE TABLE PartitionTable2 (col1 int, col2 varchar(max)) ON myRangePS1 (col1) WITH ( DATA_COMPRESSION = ROW ON PARTITIONS (1,3), DATA_COMPRESSION = NONE ON PARTITIONS (2,4) ); GO |
E. 修改表以更改壓縮
下面的示例更改在示例 A 中創建的未分區表的壓縮。
ALTER TABLE T1 REBUILD WITH (DATA_COMPRESSION = PAGE); GO |
F. 修改已分區表中的一個分區的壓縮
下面的示例更改在示例 C 中創建的已分區表的壓縮。REBUILD PARTITION = 1
語法僅僅導致重新生成編號爲
1
的分區。
ALTER TABLE PartitionTable1 REBUILD PARTITION = 1 WITH (DATA_COMPRESSION = NONE) ; GO |
使用下面的語法的同一操作則會導致重新生成表中的所有分區。
ALTER TABLE PartitionTable1 REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE ON PARTITIONS(1) ) ; GO |
G. 修改已分區表中的多個分區的壓縮
REBUILD PARTITION = ...
語法可以僅重新生成一個分區。若要重新生成多個分區,必須執行多個語句,或者執行下面的示例以重新生成所有分區(對未指定的分區使用當前的壓縮設置)。
ALTER TABLE PartitionTable1 REBUILD PARTITION = ALL WITH ( DATA_COMPRESSION = PAGE ON PARTITIONS(1), DATA_COMPRESSION = ROW ON PARTITIONS(2 TO 4) ) ; GO |
H. 修改索引的壓縮
下面的示例使用在示例 A 中創建的表,並對列 C2
創建一個索引。
CREATE NONCLUSTERED INDEX IX_INDEX_1 ON T1 (C2) WITH ( DATA_COMPRESSION = ROW ) ; GO |
執行下面的代碼,將索引改爲頁壓縮:
ALTER INDEX IX_INDEX_1 ON T1 REBUILD WITH ( DATA_COMPRESSION = PAGE ) ; GO |
I. 修改已分區索引中的單個分區的壓縮
下面的示例對一個已分區表創建索引,該表對索引的所有分區均使用行壓縮。
CREATE CLUSTERED INDEX IX_PartTab2Col1 ON PartitionTable1 (Col1) WITH ( DATA_COMPRESSION = ROW ) ; GO |
若要創建對不同的分區使用不同的壓縮設置的索引,應使用 ON PARTITIONS
語法。下面的示例對一個已分區表創建索引,該分區表在索引的分區
1
上使用頁壓縮,在索引的分區 2
至 4 上使用頁壓縮。
CREATE CLUSTERED INDEX IX_PartTab2Col1 ON PartitionTable1 (Col1) WITH (DATA_COMPRESSION = ROW ON PARTITIONS(1), DATA_COMPRESSION = PAGE ON PARTITIONS (2 TO 4 ) ) ; GO |
下面的示例更改已分區索引的壓縮。
ALTER INDEX IX_PartTab2Col1 ON PartitionTable1 REBUILD PARTITION = ALL WITH ( DATA_COMPRESSION = PAGE ON PARTITIONS(1) ) ; GO |
J. 修改已分區索引中的多個分區的壓縮
REBUILD PARTITION = ...
語法可以僅重新生成一個分區。若要重新生成多個分區,必須執行多個語句,或者執行下面的示例以重新生成所有分區(對未指定的分區使用當前的壓縮設置)。
ALTER INDEX IX_PartTab2Col1 ON PartitionTable1 REBUILD PARTITION = ALL WITH ( DATA_COMPRESSION = PAGE ON PARTITIONS(1), DATA_COMPRESSION = ROW ON PARTITIONS(2 TO 4) ) ; GO |
微軟幫助鏈接: ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.zh-CHS/s10de_1devconc/html/5f33e686-e115-4687-bd39-a00c48646513.htm