探密微软SQL Server 2008中新压缩特性

12/8/2009来源:SQL教程人气:5662

  导语: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);