SQL Server 2008中引入了数据压缩的功能,允许在表、索引和分区中执行数据压缩。这样不仅可以大大节省磁盘的占用空间,还允许将更多数据页装入内存中,从而降低磁盘IO,提升查询的性能。当然,凡事有利有弊,在启用数据压缩后,数据库服务器就需要额外的CPU资源来进行压缩处理。一般说来,数据库服务器的CPU占用率不会太高,而磁盘IO容易成为瓶颈,所以在大多数情况下对大数据库特别是数据仓库启用该项功能还是利大于弊。

AD:2013云计算架构师峰会课程资料下

SQL Server 2008的数据压缩分为行压缩和页压缩两种。行压缩主要是通过将固定长度类型存储为可变长度类型来实现,同时还减少了与记录相关联的元数据开销。页压缩在行压缩的基础上又增加了前缀压缩和字典压缩,能获得更大的压缩率。

要启用数据库压缩只需在建表语句后加入WITH (DATA_COMPRESSION = ROW)或是WITH (DATA_COMPRESSION = PAGE)即可。如需将现有的索引修改为启用压缩,可通过ALTER INDEX index ON Table REBUILD WITH (DATA_C0MPRESSION=ROW)或ALTER INDEX index ON Table REBUILD WITH (DATA_C0MPRESSION=PAGE)实现。

最后提供一段简单的用以判断是否需要压缩数据表的脚本,并自动生成压缩脚本供系统管理员执行。这里用到未公开的存储过程sp_MSforeachtable。在这段脚本中@precommand参数用于执行command指令执行前的SQL命令,建立一张临时表用于保存数据表的信息,@command1参数表示需要执行的SQL命令,对每一张表都利用sp_spaceused存储过程获取表的磁盘占用信息并保存到建立的临时表中,@postcommand参数用于执行command指令后的SQL命令,将之前建立的临时表与系统关联,根据设置的条件(数据表占用空间大于10G)生成数据表压缩脚本。

  1. exec sp_MSforeachtable
  2. @precommand=N'
  3. create table ##(
  4. id int identity,
  5. name sysname,
  6. rows int,
  7. reserved Nvarchar(50),
  8. data varchar(50),
  9. indexdata varchar(50),
  10. unused varchar(50))',
  11. @command1=N'insert into ##(name,rows,reserved,data,indexdata,unused) exec sp_spaceused ''?''
  12. update ## set data=SUBSTRING(data, 1, LEN(data) - 2) where id=scope_identity() AND LEN(data) >=2',
  13. @postcommand=N'SELECT ''ALTER TABLE '' + TABLENAME + '' REBUILD WITH ( DATA_COMPRESSION = PAGE )'' FROM sys.tables A
  14. JOIN
  15. (SELECT C.name + ''.'' + A.name AS TABLENAME, object_id FROM ## A
  16. JOIN sys.objects B
  17. ON A.name = B.name
  18. JOIN sys.schemas C
  19. ON B.schema_id = C.schema_id
  20. WHERE CAST(data AS int) > 10000000 AND object_id IN (SELECT object_id FROM sys.tables)) B
  21. ON A.object_id = B.object_id AND type = ''U'';drop table ##'

原文链接:http://www.cnblogs.com/saville/archive/2013/03/12/2955558.html

SQL Server 2008中数据压缩的更多相关文章

  1. SQL Server 2008中的数据压缩

    SQL Server 2008中引入了数据压缩的功能,允许在表.索引和分区中执行数据压缩.这样不仅可以大大节省磁盘的占用空间,还允许将更多数据页装入内存中,从而降低磁 盘IO,提升查询的性能.当然,凡 ...

  2. SQL Server 2008中新增的 1.变更数据捕获(CDC) 和 2.更改跟踪

    概述 1.变更数据捕获(CDC)        每一次的数据操作都会记录下来 2.更改跟踪       只会记录最新一条记录   以上两种的区别:         http://blog.csdn.n ...

  3. SQL Server 2008中新增的变更数据捕获(CDC)和更改跟踪

    来源:http://www.cnblogs.com/downmoon/archive/2012/04/10/2439462.html  本文主要介绍SQL Server中记录数据变更的四个方法:触发器 ...

  4. SQL Server 2008中增强的"汇总"技巧

    本文转载:http://www.cnblogs.com/downmoon/archive/2012/04/06/2433988.html SQL Server 2008中的Pivot和UnPivot: ...

  5. 利用Ring Buffer在SQL Server 2008中进行连接故障排除

    原文:利用Ring Buffer在SQL Server 2008中进行连接故障排除 出自:http://blogs.msdn.com/b/apgcdsd/archive/2011/11/21/ring ...

  6. SQL点滴15—在SQL Server 2008中调用C#程序

    原文:SQL点滴15-在SQL Server 2008中调用C#程序 T-SQL的在执行普通的查询的时候是很高效的,但是在执行循环,判断这样的语句的时候效率就不那么的高了.这时可以借助CLR了,我们可 ...

  7. 在SQL Server 2008中调用.net,dll

    原文:在SQL Server 2008中调用.net,dll T-SQL的在执行普通的查询的时候是很高效的,但是在执行循环,判断这样的语句的时候效率就不那么的高了.这时可以借助CLR了,我们可以在SQ ...

  8. SQL Server 2008中的CDC(Change Data Capture)功能使用及释疑

    SQL Server 2008中的CDC(Change Data Capture)功能使用及释疑 关键词:CDC   原文:http://www.cnblogs.com/chenxizhang/arc ...

  9. SQL Server 2008中的MERGE(不仅仅是合并)

    SQL Server 2008中的MERGE语句能做很多事情,它的功能是根据源表对目标表执行插入.更新或删除操作.最典型的应用就是进行两个表的同步. 下面通过一个简单示例来演示MERGE语句的使用方法 ...

随机推荐

  1. BZOJ 1072 排列

    Description 给一个数字串\(s\)和正整数\(d\), 统计\(s\)有多少种不同的排列能被\(d\)整除(可以有前导\(0\)).例如\(123434\)有\(90\)种排列能被\(2\ ...

  2. OpenSource.com 评出 2014 年十佳开源软件

    Docker 应用容器平台 “电源管理和虚拟化以相同的方式允许我们从服务器利用率中获取最大的利益.如何真正的解决虚拟化,这世界第一难题仍然是普遍存在的.Docker 自从 2013 年开源以来,刚好在 ...

  3. Entity Framework OData filter inherit

    过滤继承对象 TPH 的情况 EF : return Task.FromResult<IQueryable<Parent>>( query.OfType<ChildA&g ...

  4. Ajax页面逻辑

    逻辑上模拟整个与服务器通信的过程.在没有真正与服务器通信的时候,如何写这样的ajax请求. 先根据页面结构创建一个静态数据(JSON) var arrival_address_data={" ...

  5. network: Android 网络判断(wifi、3G与其他)

    package mark.zeng; import Java.util.List; import Android.content.Context; import android.location.Lo ...

  6. oracle中的exists 和not exists 用法详解(转)

    有两个简单例子,以说明 “exists”和“in”的效率问题 1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ; ...

  7. ZOJ-2008-Invitation Cards(dijkstra)

    题意: 在有向加权图中G(V,E),邮局要从起点S向其他n个节点发送邮件,于是派出n个邮递员,分别到达其他n个地点发送,然后回到起点S,求出所有邮递员所经过的总路程的最小值. 分析: 正向一次dijk ...

  8. POJ 3694 Network(无向图求桥+重边处理+LCA)

    题目大意: 给你一个无向图,然后再给你一个Q代表有Q次询问,每一次加一条边之后还有几座桥.在这里要对重边进行处理. 每次加入一条边之后,在这条搜索树上两个点的公共祖先都上所有点的桥都没了. 这里重边的 ...

  9. getting start with storm 翻译 第八章 part-2

    转载请注明出处:http://blog.csdn.net/lonelytrooper/article/details/12435641 The Bolts 首先我们看一下该topology中的标准bo ...

  10. 关于node升级到7.0,无法gulp alljs的问题

    http://stackoverflow.com/questions/40308623/cannot-find-module-internal-fs-afer-upgrading-to-node-7 ...