导语:SQLServer2005SP2为我们带来了vardecimal功能,这项功能使得原来定长的decimal数据在数据文件中以可变长的格式存储,据称这项功能可为数据仓库节省空间,而SQLServer2008在这基础上增强了数据压缩功能。
SQLServer中的数据压缩功能,最早是从SQLServer2005开始,在企业版和开发版中增加了一种叫做vardecimal的新存储格式,这通过该功能应用可以影响到decimal和numeric字段。如果数据库里的表含有decimal和numeric类型数据,用户就可以使用vardecimal存储格式来缩小数据库的大小。值得注意的是,能够节省出多少空间取决于数据库中含有多少decimal或numeric数据列、数据分布情况以及表的大小。
使用数据压缩
而正是这个数据压缩功能,成为SQLServer2008中又一新特性:数据压缩,利用该特性,可以减小数据表,索引以及分区的子集的大小。但是这个之前在SQLServer2005存在的功能,为何要在新一代版本系统中改进,存储成本不断降低的市场环境下,数据压缩技术能给企业何种好处?
尽管存储成本已经不再是企业关注的敏感因素,但是这并不代表数据库尺寸不会对企业运营中效率有影响,因为数据库尺寸除了会影响到存储成本之外,还极大地关联到管理成本和性能问题。
首先,因为数据库需要备份,数据库的尺寸越大,那么备份时间就会越长,同时消耗的备份硬件成本提升,还有一种管理成本就是数据库的维护成本。从性能方面,SQLServer在扫描磁盘读取数据的时候都是按照数据页为单位进行读取的,因此如果一张数据页中包含的数据行数越多,SQLServer在一次数据页IO中获得的数据就会越多,这样也就带来了性能的提升。
相对于SQL Server2005SP2中vardecimal的压缩数据,SQLServer2008当前放出的测试数据,采用新的数据压缩技术可以达到更高的存储率,再加上企业对于容灾而增加的存储空间,所有的这些都是SQLServer2008中这一新特性有利一面。
第2页:两种压缩模式
了解压缩数据真正好处之后,可以感受到概念的渗透,借助数据压缩,减少了存储成本,并提高查询性能,减少I/O和增加缓冲点击率。可见,这一个功能在应用过程中还是十分有效果的,SQLServer2008中的数据压缩有两种应用方式,即行压缩和页压缩,下面对这两种数据压缩类型简单做个对比。
数据压缩向导过程中选择压缩类型
行压缩。行压缩可以将固定长度类型存储为可变长度存储类型。例如char(100)列储存在一个可变长度存储格式将只使用了存储量所定义的数据。储存的“SQLServer2008”,压缩后只需要存放15个字符,而非全部100个字符,从而节省了85%的存储空间。这是在SQLServer2005ServicePack2中提供的vardecimal存储格式的思路的延伸。同时需要注意的是,这种压缩模式,将对所有数据类型的NULL和0值进行优化,从而使它们不占用任何字节。
尽管SQLServer2008数据压缩扩展了这个功能,对所有固定长度的数据类型都进行了处理,包括integer、char和float。现在数据不是以固定大小的字节进行存储,而是用最小所需的字节,只需要启用行压缩功能就可以执行。但是,行压缩无法处理XML、BLOB和MAX数据类型。
页面压缩模式。这种压缩功能,建立在行压缩基础之上,通过只存储一次页面上相同事件字节来将存储的冗余数据减到最小。使用页压缩压缩表和索引,除了采用行压缩,还采用了前缀压缩和字典压缩。
数据压缩会减少的大小您的表格或索引指标,最好是先评估一下压缩后所能节省的空间。每一个页都是单独压缩的,前缀和字典也存储在页内。由于页是存储分配的原子单位,将半页压缩到四分之一页是没有任何意义的,所以,只有在页的内容快满的时候才会开始压缩处理。
在使用行和页压缩时还有一个性能权衡问题,因为CPU使用率会上升,但I/O使用率和内存占用会下降。但这所有的压缩选项可能成为SQLServer2008企业版专享选项。
第3页:如何使用数据压缩
附录(如何使用数据压缩):
(1)启用行压缩
如果我们要在指定的表上启用行压缩,可执行以下语句:
CREATE TABLE Alpha(col1 int,col2 char(1000))
WITH (DATA_COMPRESSION = ROW)
(2)启用页压缩
如果我们要在指定的分区上启用压缩,可执行以下语句:
CREATE TABLE Alpha_Partition(col1 int,col2 char(1000))
ON PartitionScheme(col 1)
WITH
(DATA_COMPRESSION = PAGE ON)
PARTITIONS(1-3)
(3)修改压缩
如果要把一个现有的索引修改为使用压缩,可执行以下语句:
ALTER INDEX Collndx ON Alpha REBUILD
WITH (DATA_C0MPRESSION=PAGE)
ALTER INDEX Collndx ON Alpha REBUILD
partition = 2
WITH (DATA_COMPRESSION=PAGE)
SQL Server 2008中的压缩选项可以在创建表或索引时通过Option进行设置,例如:
CREATE TABLE TestTable (col1 int,col2varchar(200))WITH(DATA_COMPRESSION = ROW);
如果需要改变一个分区的压缩选项,则可以用以下语句:
ALTER TABLE TestTable REBUILD PARTITION = 1 WITH(DATACOMPRESSION=PAGE);
如果需要为分区表的各个分区设置不同的压缩选项,可以使用以下的语句:(SQLServer2008可以对不同的分区使用不同的压缩选项,这一点对于数据仓库应用是非常重要的,因为数据仓库的事实表通常都会有一个或数个热分区,这些分区中的数据经常需要更新,为了避免数据压缩给这些分区上的数据更新带来额外的处理载荷,可以对这些分区关闭压缩选项)
CREATE TABLE PartitionedTable (col1 int, col2varchar(200))
ON PS1 (col1)
WITH (DATA_COMPRESSION = ROW ON PARTITIONS(1),
DATA_COMPRESSION = PAGE ON PARTITION(2 TO 4));
如果是为某个索引设置压缩选项的话,可以使用:
CREATE INDEX IX_TestTable_Col1 ONTestTable(Col1)WITH(DATA_COMPRESSION = ROW);
如果是修改某个索引的压缩选项,可以使用:
ALTER INDEX IX_TestTable_Col1 ONTestTableREBUILDWITH(DATA_COMPRESSION = ROW);