表和索引的行压缩和页压缩

表和索引的行压缩和页压缩

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值