表和索引的行壓縮和頁壓縮

表和索引的行壓縮和頁壓縮

SQL Server 2008 支持表和索引的行壓縮和頁壓縮。可以爲以下數據庫對象配置數據壓縮:

  • 存儲爲堆的整個表。

  • 存儲爲聚集索引的整個表。

  • 整個非聚集索引。

  • 整個索引視圖。

  • 對於已分區表和已分區索引,可爲每個分區配置壓縮選項,且對象的各個分區的壓縮設置不必相同。

表的壓縮設置不自動應用於它的非聚集索引。必須單獨設置每個索引。壓縮功能不可用於系統表。如果表和索引是使用 CREATE TABLE 和 CREATE INDEX 語句創建的,則可以壓縮。若要更改表、索引或分區的壓縮狀態,請使用 ALTER TABLE 或 ALTER INDEX 語句。

 

估算壓縮後的節省量

若要確定更改壓縮狀態對錶或索引的影響,可使用 sp_estimate_data_compression_savings 存儲過程。sp_estimate_data_compression_savings 存儲過程僅在 SQL Server 的支持數據壓縮的版本中可用。

 

啓動數據壓縮嚮導

  1. 在對象資源管理器中,右鍵單擊一個表、索引或索引視圖,指向“存儲”,然後單擊“壓縮”

監視壓縮

若要監視 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
<//ddue.schemas.microsoft.com/authoring/2003/5:sections xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5">

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. 修改已分區索引中的多個分區的壓縮

<//ddue.schemas.microsoft.com/authoring/2003/5:content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5">

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章