天天看点

SQL SERVER 2008的数据压缩

一、数据库版本

数据压缩在Sql Server 2008上才支持,2005不行,并且还要是企业版。我常常忘了这一点,在2005的Studio上闹出语法错误的状况,折腾浪费了好一阵才醒悟过来。

二、压缩状况

大约可以节省20%-50%的空间,并且行压缩和页压缩有所区别。

但让我失望的是,像含有Varchar(max),xml这种字段类型的,反而似乎压缩不起什么作用。其实我觉得最需要压缩的就是它们。

三、行压缩与页压缩

行压缩是将固定长度类型存储为可变长度存储类型。页压缩除了行压缩,还有字典压缩等等。就是说,页级比行级压得更狠,更厉害。通常,表的话我采用页压缩;索引,行压缩。不为什么,想当然耳。

四、开始压缩

压缩的时候,硬盘要有空余的空间,因为压缩需要消耗额外的磁盘。比如说,我压缩一个190GB的表,大概还要额外占用90GB的空间。压缩完了以后,可以通过收缩数据库文件释放。释放了以后空间就连本带利多上一点。

非分区表页级压缩

ALTER TABLE [table1] REBUILD WITH (DATA_COMPRESSION = PAGE);

GO

分区表页级压缩

ALTER TABLE [partitiontable1]
 REBUILD PARTITION = ALL 
 WITH
 (
 DATA_COMPRESSION = PAGE ON PARTITIONS(1 TO 11) 
 );
 GO 非分区索引行级压缩
ALTER INDEX ix_id
 ON table1
 REBUILD WITH ( DATA_COMPRESSION = ROW ) ;
 GO
 
 分区索引行级压缩
ALTER INDEX Ix_Id ON partitiontable1
 REBUILD PARTITION = ALL 
 WITH
 (
 DATA_COMPRESSION = ROW ON PARTITIONS(1 TO 16) 
 );
 GO      

五、压缩以后收缩数据库文件

DBCC SHRINKFILE ([数据库文件逻辑名], 收缩至多大(以M为单位));

GO

DBCC SHRINKFILE ([data_0], 5371);

GO

这个收缩后大小,我是先在Studio中,选中数据库,鼠标右键,在菜单中选任务,收缩,然后得到这个收缩后的最小尺寸,再抄到脚本上的。

其实帮助里面说,DBCC SHRINKFILE 不会将文件收缩到小于存储文件中的数据所需要的大小。例如,如果使用 10 MB 数据文件中的 7 MB,则带有 target_size 为 6 的 DBCC SHRINKFILE 语句只能将该文件收缩到 7 MB,而不能收缩到 6 MB。那么我们将5371写成1,岂不快哉?我没有试,可能可以。

六、经验总结

压缩和收缩分区表、分区索引消耗好多时间。有个几十G的分区表,我压缩完了以后,收缩花了2天又19个小时,是用脚本执行的,一口气不停歇。

非分区表则很快,100多G的文件,1、2小时就搞定了。

七、为什么要压缩

我觉得数据库服务器的瓶颈往往在于硬盘。象我们的服务器,8个核,平常时CPU很少上到10%,到30%已经顶天了。压缩的意义,就是将硬盘的压力转一部分到CPU,正中下怀。

另一个就是,现在我们网站功能逐渐多了以后,数据增长也很快。几年下来,数据积累相当可观,现在已经用了600多G了。