一般是遇到IO问题了,才去进行压缩。既然前2个分区很少被用到了,就不用进行压缩了吧。 而第3个分区作为报表使用,可以考虑使用压缩。 第4个分区经常进行查询和修改,使用压缩可能会增加CPU成本,应综合考虑。对分区的压缩可以考虑如下例子--创建分区函数 Create partition function tablecompression(int) as range right for values(1,10000,12000,16000)--创建分区scheme create partition scheme keyrangeps as partition tablecompression to([default],[default],[default],[default],[default])--创建分区表 create table partitiontable (keyid int, description varchar(30)) on keyrangeps(keyid) with ( data_compression=row on partitions(1), --选择压缩分区,和压缩方式 data_compression=page on partitions(2 to 4) ) 当然,也可以通过alter table xxx rebuild with (data_compression=page on partitions(1))的方式来实现。为什么使用页级压缩和行级压缩,就参考联机文档吧,会全面些。
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) ); GOD. 对已分区表设置 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) ) ; GOH. 修改索引的压缩 下面的示例使用在示例 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
而第3个分区作为报表使用,可以考虑使用压缩。
第4个分区经常进行查询和修改,使用压缩可能会增加CPU成本,应综合考虑。对分区的压缩可以考虑如下例子--创建分区函数
Create partition function tablecompression(int)
as range right
for values(1,10000,12000,16000)--创建分区scheme
create partition scheme keyrangeps
as partition tablecompression
to([default],[default],[default],[default],[default])--创建分区表
create table partitiontable
(keyid int,
description varchar(30))
on keyrangeps(keyid)
with (
data_compression=row on partitions(1), --选择压缩分区,和压缩方式
data_compression=page on partitions(2 to 4)
)
当然,也可以通过alter table xxx rebuild
with (data_compression=page on partitions(1))的方式来实现。为什么使用页级压缩和行级压缩,就参考联机文档吧,会全面些。
下面的示例创建一个表并将压缩设置为 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)
);
GOD. 对已分区表设置 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)
) ;
GOH. 修改索引的压缩
下面的示例使用在示例 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