SQL Server 2008中的数据表压缩功能详细介绍

SQL Server 2005 SP2为我们带来了vardecimal功能,当时针对decimail和numeric数据类型推出了新的存储格式--vardecimal。vardecimal存储格式允许 decimal和numeric数据类型的存储作为一个可变长度列。 这项功能使得原来定长的decimal数据在数据文件中以可变长的格式存储,据称这项功能可以为典型的数据仓库节省30%的空间,而SQL Server 2008在这一基础上又进一步增强了数据压缩功能。SQL Server 2008现在支持行压缩和页面压缩两种选项,数据压缩选项可以在以下对象上启用:

1.未创建聚簇索引的表
2.创建聚簇索引的表
3.非聚簇索引(对表设置压缩选项不会影响到该表上的非聚簇索引,因此聚簇索引的压缩需要单独设置)
4.索引视图
5.分区表和分区索引中的单个分区

使用数据压缩的意义:

首先让我们来看看,为什么在存储成本不断降低的今天,微软还要煞费苦心地在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则是在一张数据页面上依次采用:

1.行压缩
2.前缀压缩
3.字典压缩

使用数据压缩注意事项:

尽管SQL Server 2008的数据压缩功能非常有价值,但是仍然需要注意一些问题:
数据压缩功能仅在企业版和开发版中可用

数据压缩可以让一张数据页存储更多的数据行,但是并不能改变单行数据最长8060字节这一限制。

在一张已经设置了数据压缩的表上创建聚簇索引时,聚簇索引默认继承原表上的压缩选项

在未设置聚簇索引的表上设置页面压缩时,只有以下情况才会获得页面压缩的实际效果:

1.数据使用BULK INSERT语法添加到表中
2.数据使用INSERT INTO ... WITH (TABLOCK)语法添加到表中
3.执行带有页面压缩选项的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的工作载荷,同时将以压缩的数据表导出到外部文件时,可能会消耗比原来多很多的空间。

相信到了这里,朋友们对于SQL Server 2008中的数据压缩技术有了一个较为全面的了解。

(0)

相关推荐

  • SQL Server 2008中的数据表压缩功能详细介绍

    SQL Server 2005 SP2为我们带来了vardecimal功能,当时针对decimail和numeric数据类型推出了新的存储格式--vardecimal.vardecimal存储格式允许 decimal和numeric数据类型的存储作为一个可变长度列. 这项功能使得原来定长的decimal数据在数据文件中以可变长的格式存储,据称这项功能可以为典型的数据仓库节省30%的空间,而SQL Server 2008在这一基础上又进一步增强了数据压缩功能.SQL Server 2008现在支持

  • SQL Server 2008中的FileStream介绍

    很多朋友并不知道FileStream 这个功能.因为FileStream 一般在安装的时候默认是不启用的,在SQL Server 2008中,引入了Filestream,使用它可以将非机构化大型数据(如文本文档.图像和视频)等以varbinary(max)的形式存储在文件系统中.使用数据库的备份还原功能可以将这些数据一起备份还原. 在选择数据库文件路径那个窗口,有一个标签是"FileStream".如果在安装的时候你没有启用,安装后可以通过以下设置来开启FileStream 功能. 1

  • SQL Server 2008中的代码安全(三) 通过PassPhrase加密

    前言: 在SQL Server 2005和SQL Server 2008之前.如果希望加密敏感数据,如财务信息.工资或身份证号,必须借助外部应用程序或算法.SQL Server 2005引入内建数据加密的能力,使用证书.密钥和系统函数的组合来完成. 与数字证书类似.SQL Server 证书包括公钥和私钥这一对密钥,它们都用来加密和解密数据.SQL Server也拥有创建非对称密钥和对称密钥对象的能力.非对称密钥(asymmetric key)与证书相似,公钥用来加密数据库,私钥用来解密数据.非

  • SQL Server创建数据库和数据表的相关约束实现方法

    本文分析了SQL Server创建数据库和数据表的相关约束实现方法.分享给大家供大家参考,具体如下: 创建约束语法如下: CREATE DATABASE [test] ON (NAME=N'test',FILENAME=N'd:\SQL2kt_Data\test.mdf',SIZE=3mb,MAXSIZE=UNLIMITED,FILEGROWTH=1MB) LOG ON (NAME=N'test_log',FILENAME=N'd:\SQL2kt_Data\test_log.ldf',SIZE=

  • SQL Server 2008数据库误删数据如何进行数据恢复

    有个朋友很着急地打电话给我,他用delete语句误删除了SQL Server 2008数据库中两个表中的所有记录,而这个数据库之前没有任何备份.让我帮他解决一下,不然他要赔偿客户很多钱. SQL Server中误删除数据的恢复本来不是件难事,从事务日志恢复即可.但是,这个恢复需要有两个前提条件: 1. 至少有一个误删除之前的数据库完全备份. 2. 数据库的恢复模式(Recovery mode)是"完整(Full)". 针对这两个前提条件,会有三种情况: 情况一.如果这两个前提条件都存在

  • SQL Server 2008中的代码安全(二) DDL触发器与登录触发器

    本文主要 涉及DDL触发器和登录触发器的应用实例. MicrosoftSQL Server 提供两种主要机制来强制使用业务规则和数据完整性:约束和触发器.触发器为特殊类型的存储过程,可在执行语言事件时自动生效.SQL Server 包括三种常规类型的触发器:DML 触发器.DDL 触发器和登录触发器. 1.当数据库中发生数据操作语言 (DML) 事件时将调用 DML 触发器.DML 事件包括在指定表或视图中修改数据的 INSERT 语句.UPDATE 语句或 DELETE 语句.DML 触发器可

  • SQL Server 2008中的代码安全(八)透明加密(TDE)

    当一个用户数据库可用且已启用TDE时,在写入到磁盘时在页级实现加密.在数据页读入内存时解密.如果数据库文件或数据库备份被盗,没有用来加密的原始证书将无法访问.这几乎是SQL Server2008安全选项中最激动人心的功能了,有了它,我们至少可以将一些初级的恶意窥视拒之见外. 下面的两个例子将展示如何启用和维护透明数据加密. 示例一.启用透明加密(TDE) /********************TDE**************** 3w@live.cn ****************/ U

  • SQL SERVER 2008 中三种分页方法与比较

    建立表: 复制代码 代码如下: CREATE TABLE [TestTable] ( [ID] [int] IDENTITY (1, 1) NOT NULL , [FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL , [LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL , [Country] [nvarchar] (50) COLLATE Chinese_PRC_

  • SQL Server 2008中SQL查询语句字段值不区分大小写的问题解决

    一.问题 最近在一个系统的对外接口中,经过测试人员测试,发现登录接口中输入的用户名不区分大小写,经过排查找原因,原来是由于数据库忽略了大小写. 二.解决办法 Select * from Base_UserInfo where User_Account='Admin' COLLATE Chinese_PRC_CS_AI; 1.数据库设置排序规则,如下图所示: 2.SQL语句设置,如下: alter database 你的数据库名 COLLATE Chinese_PRC_CS_AI; 3.字段级设置

  • SQL Server 2008中的代码安全(六) 对称密钥加密

    证书和非对称密钥使用数据库级的内部公钥加密数据,并且使用数据库级内部私钥解密数据.而对称密钥相对简单,它们包含一个同时用来加密和解密的密钥.困此,使用对称密钥加密数据更快,并且用在大数据时更加合适.尽管复杂度是考虑使用它的因素,但它仍然是一个很好的加密数据的选择. 我们看一组例子: 示例一.创建对称密钥 对称密钥的特性是:在数据库会话中使用它对数据进行加密和解密前必须首先打开. 创建对称密钥使用如下命令:CREATE SYMMETRIC KEY  创建对称密钥.(http://msdn.micr

随机推荐