如何使用数据压缩
SQL Server 2008中的压缩选项可以在创建表或索引时通过Option进行设置,例如:CREATE TABLE TestTable (col1 int, col2 varchar(200)) WITH (DATA_COMPRESSION = ROW);
如果需要改变一个分区的压缩选项,则可以用以下语句:ALTER TABLE TestTable REBUILD PARTITION = 1 WITH (DATA COMPRESSION = PAGE);
如果需要为分区表的各个分区设置不同的压缩选项,可以使用以下的语句:(SQL Server 2008可以对不同的分区使用不同的压缩选项,这一点对于数据仓库应用是非常重要的,因为数据仓库的事实表通常都会有一个或数个热分区,这些分区中的数据经常需要更新,为了避免数据压缩给这些分区上的数据更新带来额外的处理载荷,可以对这些分区关闭压缩选项)CREATE TABLE PartitionedTable (col1 int, col2 varchar(200))
ON PS1 (col1)
WITH (
DATA_COMPRESSION = ROW ON PARTITIONS(1),
DATA_COMPRESSION = PAGE ON PARTITION(2 TO 4));
如果是为某个索引设置压缩选项的话,可以使用:
CREATE INDEX IX_TestTable_Col1 ON TestTable (Col1) WITH (DATA_COMPRESSION = ROW);
如果是修改某个索引的压缩选项,可以使用:ALTER INDEX IX_TestTable_Col1 ON TestTable REBUILD WITH (DATA_COMPRESSION = ROW);
SQL Server 2008同时还提供了一个名为sp_estimate_data_compression_savings存储过程帮助DBA估计激活压缩选项后对象尺寸。
数据压缩是怎样工作的
对于行压缩,SQL Server 2008采用以下三种方法来节省存储空间:
减少了与记录相关联的元数据开销。此元数据为有关列、列长度和偏移量的信息。在某些情况下,元数据开销可能大于旧的存储格式。
它对于数值类型(例如,integer、decimal和float)和基于数值的类型(例如,datetime和money)使用可变长度存储格式。
它通过使用不存储空字符的可变长度格式来存储定长字符串。
对于页面压缩,SQL Server 2008则是在一张数据页面上依次采用:
行压缩
前缀压缩
字典压缩
配置数据压缩功能需要注意的
尽管SQL Server 2008的数据压缩功能非常有价值,但是仍然需要注意一些问题:
数据压缩功能仅在企业版和开发版中可用
数据压缩可以让一张数据页存储更多的数据行,但是并不能改变单行数据最长8060字节这一限制
在一张已经设置了数据压缩的表上创建聚簇索引时,聚簇索引默认继承原表上的压缩选项
在未设置聚簇索引的表上设置页面压缩时,只有以下情况才会获得页面压缩的实际效果:
数据使用BULK INSERT语法添加到表中
数据使用INSERT INTO ... WITH (TABLOCK)语法添加到表中
执行带有页面压缩选项的ALTER TABLE ... REBUILD命令
在未设置聚簇索引的表上更改压缩选项,会导致该表上所有非聚簇索引都需要重建,因为这些非聚簇索引指向的数据行地址已经都发生了改变。
在改变压缩选项时所需要的临时空间大小与创建索引是所需要的空间是一样的,因此对于分区表,我们可以逐个分区设置压缩选项来减少临时空间的需求压力。
由于SQL Server 2008中数据压缩技术其实是SQL Server 2005 SP2中vardecimal技术的一个超集,因此设置了数据压缩后就没有必要保留vardecimal了。当然SQL Server 2008为了保持向后兼容性,在当前版本中仍然保留了vardecimal,但是SQL Server 2008的下一个版本及可能就会弃用vardecimal选项,因此做了这些设置的数据库应该尽早改变到数据压缩设置下。
SQL Server 2008的压缩选项是工作在存储引擎层的,对于SQL Server的其他部件来说这一特性是透明的,因此当我们用BULK LOAD的方式将外面的数据导入SQL Server时,会显著的增加CPU的工作载荷,同时将以压缩的数据表导出到外部文件时,可能会消耗比原来多很多的空间。