SQL Server 2005 SP2为我们带来了vardecimal 功能 ,这项 功能 使得原来定长的decimal 数据 在 数据 文件中以可变长的格式存储,据称这项 功能 可以为典型的 数据 仓库节省30%的空间,而SQL Server 2008在这一基础上又进一步增强了 数据 压缩 功能 。 SQL Se
SQL Server 2005 SP2为我们带来了vardecimal 功能 ,这项 功能 使得原来定长的decimal 数据 在 数据 文件中以可变长的格式存储,据称这项 功能 可以为典型的 数据 仓库节省30%的空间,而SQL Server 2008在这一基础上又进一步增强了 数据 压缩 功能 。
SQL Server 2008现在支持行 压缩 和页面 压缩 两种选项, 数据 压缩 选项可以在以下对象上启用:
未创建聚簇索引的表
创建聚簇索引的表
非聚簇索引(对表设置 压缩 选项不会影响到该表上的非聚簇索引,因此聚簇索引的 压缩 需要单独设置)
索引视图
分区表和分区索引中的单个分区
为什么需要 数据 压缩
首先可能需要讨论的问题就是为什么在存储成本不断降低的今天,微软还要煞费苦心地在SQL Server中实现并且不断改进 数据 压缩 技术呢?
尽管存储成本已经不再是传统意义上的首要考虑因素,但是这并不代表 数据 库尺寸不是一个问题,因为 数据 库尺寸除了会影响到存储成本之外,还极大地关联到管理成本和性能问题。
首先我们来讨论为什么会有管理成本的问题?因为 数据 库需要备份, 数据 库的尺寸越大,那么备份时间就会越长,当然另外一点就是消耗的备份硬件成本也会随之提高(包括需要的备份介质成本和为了满足备份窗口而需要更高级的备份设备带来的采购成本),还有一种管理成本就是 数据 库的维护成本,例如我们经常需要完成的DBCC任务, 数据 库尺寸越大,我们就需要更多的时间来完成这些任务。
接着我们再看看性能问题。SQL Server在扫描磁盘读取 数据 的时候都是按照 数据 页为单位进行读取的,因此如果一张 数据 页中包含的 数据 行数越多,SQL Server在一次 数据 页IO中获得的 数据 就会越多,这样也就带来了性能的提升。
最后考虑存储的成本,按照原先SQL Server 2005 SP2中vardecimal的 压缩 数据 为例,30%的空间节省也就意味着30%的存储成本,而按照SQL Server 2008当前放出的测试 数据 ,采用新的 数据 压缩 技术可以达到2X-7X的存储率,再加上如果企业要考虑容灾而增加的存储空间,这样节省的存储硬件成本也将是想当可观的。
如何使用 数据 压缩
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的工作载荷,同时将以 压缩 的 数据 表导出到外部文件时,可能会消耗比原来多很多的空间
查看更多关于SQLServer2008中的数据压缩功能的详细内容...