从SQL SERVER 2008开始,SQL SERVER 提供了对数据进行压缩的功能,启用数据压缩无须修改应用程序。

数据压缩可有效减少数据的占用空间,读取和写入相同数据花费的IO也响应减少,从而可以有效缓解IO压力,但由于数据在读取和写入时需要压缩和解压缩,因此会消耗CPU资源,但不代表在相同负载下,启用数据压缩会导致CPU的使用率变高,某些操作会因为数据页数量的减少而降低CPU资源的消耗。

可以配置数据压缩的对象有:
1>存储为堆的整个表。
2>存储为聚集索引的整个表。
3>整个非聚集索引。
4>整个索引视图。
5>对于已分区表和已分区索引,可为每个分区配置压缩选项,且对象的各个分区的压缩设置不必相同。
(个人理解:数据压缩是在parition级别上使用,未分区表和未分区索引同样可以找到一个对应的partitionID)

数据压缩方式有两种
1:行压缩
2:页压缩

行压缩实现:
行压缩更改与数据类型相关联的数据的物理存储格式来实现压缩:
1>减少了与记录相关联的元数据开销。 此元数据为有关列、列长度和偏移量的信息。 在某些情况下,元数据开销可能大于旧的存储格式。
2>它对于数值类型(例如,integer、decimal 和 float)和基于数值的类型(例如,datetime 和 money)使用可变长度存储格式。
3>它通过使用不存储空字符的可变长度格式来存储定长字符串。

快速理解:
对应数值类型和基于数值的类型来说,由于需要类型定义范围内的数据,因此需要相对较大的定长空间,如BIGINT占用8个字节,但对于值1来说,只需要一个字节便可以存放,启用行压缩便可以节省7个字节的空间;对于定长数据类型,如果存放的数据未达到指定长度,会补空字符来填满,如类型CHAR(200)用来存放字符串"1"会花费200个字节,但启用行压缩后,会将填充的空字符移除,只需要1个字节便可以存放。而对于类型bit来说,除自身消耗的空间外,还需要额外的4个bit来存放元数据,因此也可以从行压缩中获益。

行压缩影响的数据类型可参考http://msdn.microsoft.com/zh-cn/library/cc280576.aspx

页压缩实现:
页压缩是在行压缩的基础上进行前缀压缩,然后再进行字典压缩

前缀压缩:前缀压缩针对页中的各列来进行压缩,首先从列中选取出一个前缀值(不要求页中每一行的该列的值都包含此前缀)存放在页头,然后使用该前缀替换页中每一行的该列值,如提起前缀为aabbcc,对应值aabbccdd则替换为6dd,对应值aadd则替换为2dd,对应值ccbbdd则替换成0ccbbdd,对应值aabbcc则替换成[],每行会生成一个前缀来处理。

字典压缩:字典压缩是在前缀压缩完成后,搜索页面上任意位置的重复值,然后将它们存储在 CI 区域中。 与前缀压缩不同,字典压缩不局限于一列。 字典压缩可以替换页面上任意位置出现的重复值。

当表和索引使用页压缩后,对于一个新的页面,插入数据行时会对该行启用行压缩,直到该页已满无法存放新增加的行时,才会使用页压缩的算法计算启用页压缩是否能存放新增加的行,如果可以存放,则对该页进行页压缩并将新增加的行放到该页,如果不能存放,则不对该页启用页压缩,申请新页来存放新行。

在SQL SERVER 2012中,SQL Server 使用 Unicode 标准压缩方案 (Standard
Compression Scheme for Unicode, SCSU) 算法实现来压缩在行或页压缩对象中存储的 Unicode 值。
对于这些压缩对象,Unicode 压缩对于 nchar(n) 和 nvarchar(n) 列而言是自动的。 数据库引擎 将 Unicode
数据存储为 2 个字节,无论区域设置如何。 这称为 UCS-2 编码。 对于某些区域设置而言,在 SQL Server 中实现 SCSU
压缩可节省高达 50% 的存储空间。

数据压缩Demo

--=============================================================================================================================
--=========================================================
--判断表和索引是否启用压缩和压缩类型
--宋桑提供
SELECT DISTINCT
SCHEMA_NAME(o.schema_id) + '.' + OBJECT_NAME(o.object_id) AS TableName,
i.name AS IndexName,
p.data_compression_desc AS CompressionType,
i.type_desc AS StorageType
FROM sys.partitions p with(nolock)
INNER JOIN sys.objects o with(nolock)
ON p.object_id = o.object_id
JOIN sys.indexes i
ON p.object_id = i.object_id
AND i.index_id = p.index_id
WHERE p.data_compression > 0
AND SCHEMA_NAME(o.schema_id) <> 'SYS' --=========================================================
--使用采样来预估数据对象启用压缩前后的空间使用
--参考链接:http://msdn.microsoft.com/zh-cn/library/cc280574.aspx
--PS:该算法只能起参考作用,数据压缩得到的空间可能比预估的要大很多
EXEC sp_estimate_data_compression_savings 'dbo', 'TB', NULL, NULL, 'ROW' ; --=========================================================
--对表使用数据压缩
ALTER TABLE <table_name>
REBUILD PARTITION = ALL
WITH (DATA_COMPRESSION = PAGE|ROW) --=========================================================
--对表中特定分区指定压缩
ALTER TABLE <table_name>
REBUILD PARTITION = 1 WITH (DATA_COMPRESSION = PAGE|ROW) --=========================================================
--对表中多个特定分区指定压缩
ALTER TABLE <table_name>
REBUILD PARTITION = ALL
WITH (DATA_COMPRESSION = PAGE ON PARTITIONS(<range>),
... )
--=========================================================
--在新建索引时指定压缩
CREATE CLUSTERED INDEX [CLX_ID] ON [dbo].[TB2]
(
[ID] ASC
)WITH (DATA_COMPRESSION = { NONE | ROW | PAGE}) ON [PRIMARY]
GO --=========================================================
--使用重建索引来进行压缩
ALTER INDEX [CLX_ID] ON [dbo].[TB2] REBUILD PARTITION = ALL
WITH ( DATA_COMPRESSION = { NONE | ROW | PAGE }) --=============================================================================================================================

压缩试验:
压缩表定义为:

CREATE TABLE [dbo].[TB1](
[id] [bigint] IDENTITY(1,1) PRIMARY KEY,
[star_uid] [bigint] NOT NULL,
[source_uid] [bigint] NOT NULL,
[site_type] [tinyint] NOT NULL,
[site_server_type] [tinyint] NOT NULL,
[site_id] [bigint] NOT NULL,
[count] [int] NOT NULL,
[create_date] [bigint] NOT NULL,
) ON [PRIMARY]

压缩前占用空间:7309288KB
压缩后占用空间:2594624KB
压缩使用时间:3分58秒
压缩环境:8Core 32G 4块SAS(15000转4盘片)做RAID 10

SQL SERVER 数据压缩的更多相关文章

  1. SQL Server 2008中的数据压缩

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

  2. SQL Server 2008中数据压缩

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

  3. SQL Server 重新组织生成索引

    标签:SQL SERVER/MSSQL SERVER/数据库/DBA/索引/统计信息 概述 无论何时对基础数据执行插入.更新或删除操作,SQL Server 数据库引擎都会自动维护索引.随着时间的推移 ...

  4. SQL Server 2014新特性探秘(3)-可更新列存储聚集索引

    简介      列存储索引其实在在SQL Server 2012中就已经存在,但SQL Server 2012中只允许建立非聚集列索引,这意味着列索引是在原有的行存储索引之上的引用了底层的数据,因此会 ...

  5. SQL SERVER 2014 各个版本支持的功能

    转自:https://technet.microsoft.com/library/cc645993 转换箱规模限制 功能名称 Enterprise Business Intelligence Stan ...

  6. 7、SQL Server索引、表压缩

    索引 什么是索引? 索引是一种磁盘上的数据结构,建立在表或视图的基础上.使用索引可以使数据的获取更快更高校,也会影响其他的一些性能,如插入或更新等. 索引主要分为两种类型:聚集索引和非聚集索引. 字典 ...

  7. Design5:Sql server 文件组和文件

    1,文件组和文件的作用 Sql Server的数据存储在文件中,文件是实际存储数据的物理实体,文件组是逻辑对象,Sql server通过文件组来管理文件. 一个DataBase有一个或多个FileGr ...

  8. SQL Server 内存相关博文

    Don’t confuse error 823 and error 832 本文大意:      错误832:           A page that should have been const ...

  9. 解读SQL Server 2014可更新列存储索引——存储机制

    概述 SQL Server 2014被号称是微软数据库的一个革命性版本,其性能的提升的幅度是有史以来之最. 可更新的列存储索引作为SQL Server 2014的一个关键功能之一,在提升数据库的查询性 ...

随机推荐

  1. requestAnimationFrame 持续动画效果

    1. requestAnimationFrame 概述 requestAnimationFrame 是浏览器用于定时循环操作的一个API, 类似于setTimeout, 主要用途是按帧对网页进行重绘. ...

  2. jmeter --JVM调优设置

    JMeter用户可根据运行的计算机配置,来适当调整JMeter.bat中的JVM调优设置,如下所示: set HEAP=-Xms512m -Xmx512m set NEW=-XX:NewSize=12 ...

  3. file命令详解

    Linux file命令 Linux file命令用于辨识文件类型. 通过file指令,我们得以辨识该文件的类型 用法: file [-bchikLNnprsvz0] [--apple] [--mim ...

  4. 教你用CMD命令查询域名的DNS解析记录:A,NS,MX,CNAME,TXT

    1.查询域名的A记录 nslookup -qt=A qqgzs.com 当然查询A记录你直接用ping命令来ping域名也可以获得A记录. 2.查询域名的NS记录 nslookup -qt=NS qq ...

  5. Elasticsearch的脚本化数据导入导出

    我用的ES的版本是2.4.1,由于没有相应的命令实现数据的导入和导出,就是像mysql的那种mysqldump类似的指令. 更苦逼的是,我们的生产和测试环境,还不能联网,连ES的第三方的插件都没有办法 ...

  6. 图数据库cayley+mongo的起航之旅

    图数据库,目前比较主流的可能是Neo4j以及cayley了.但是,由于Neo4j只有社区版是免费的,所以,选择cayley作为项目的最终选择! 今天就简单的介绍下,我的起航之旅. 1.安装go语言环境 ...

  7. 一加3刷不了官方recoery

    遇到 target reported max download size of 直接用救砖工具,恢复出厂. http://www.oneplusbbs.com/thread-2849353-1-1.h ...

  8. WPF实现打印用户界面功能

    方式一:public bool Print(string pathStr) { try { if (File.Exists(pathStr) == false) return false; var p ...

  9. Word中选择中内容后变成C,VMware 虚拟中Ctrl键一直被按住了

    Word中选择中内容后变成C: 解决办法:关闭金山词霸的[划词翻译]功能即可. VMware 虚拟中Ctrl键一直被按住了: 解决办法:关闭金山词霸的[取词翻译]功能即可.

  10. 恢复word中审阅选项卡

    碰到在Word中,使用自定义功能区添加审阅选项卡,仍然不显示审阅选项卡 二个办法: 1.检查COM加载项,找出并从此禁用,如:iWebOffice2009.ocx 2.创建自定选项卡“审阅(自定义)” ...