表分为4个分区,前2个分区很少被用到,第3个分区作为报表用,第4个分区经常被查询和修改,分别对这4个分区进行页或行压缩,要怎么选择,为什么?

解决方案 »

  1.   

    一般是遇到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))的方式来实现。为什么使用页级压缩和行级压缩,就参考联机文档吧,会全面些。
      

  2.   

    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