从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. parcel (另一个打包工具)知识点

    ParcelJS 本身是 0 配置的,但 HTML.JS 和 CSS 分别是通过 posthtml.babel 和 postcss 处理的,所以我们得分别配 .posthtmlrc..babelrc ...

  2. secureCRT 设置证书免密登陆

    1 第一步 2 第二步 3 第三步 4 第4 步 ,然后选择你的 私钥文件

  3. win10系统 安装好composer后 cmd 命令行下输入composer提示不是内部或外部的命令,也不是可执行的程序或批处理文件

    在 windows CMD 下运行composer 出现错误提示: 不是内部或外部命令,也不是可运行的程序或批处理文件,这是因为没有配置 PATH 环境变量. 以 win10 为例,找到此电脑右击选择 ...

  4. python selenium-webdriver 生成测试报告 (十四)

    测试最后的一个重要的过程就是生成一份完整的测试报告,生成测试报告的主要是通过python的一个第三方模块HTMLTestRunner.py生成,但是生成的测试报告不是特别的美观,而且没有办法统计测试结 ...

  5. 测试ik分词效果

    POST:   http://192.168.1.12:9200/ddycdr/_analyze?analyzer=ik_max_word body:      {"text":& ...

  6. The Best KPIs to Use in Your Company

    Here is a list of key performance indicators (KPIs) that should be used in contact centres, alongsid ...

  7. VarIsOrdinal,VarIsFloat,VarIsNumeric判断数字

    VarIsOrdinal        VarIsFloat        VarIsNumeric 就三个. 第一个 是否int,boolean 第二个 是否Double,Simple,Curren ...

  8. http网站上传文件大小问题【没测试过】

    web.config <httpRuntime maxRequestLength="" executionTimeout=""/> IIS 请求筛选 ...

  9. 黄聪:WordPress 启用HTTPS设置(转)

    HTTPS已经成为网站的一种趋势,得益于数以万计的开发者和百万计的玩家,Wordpress启用HTTPS过程相当简单.下面就把Wordpress启用HTTPS访问的过程记录一下,以供参考. 一. 修改 ...

  10. 《剑指offer(第二版)》面试题55——判断是否为平衡二叉树

    一.题目大意 输入一颗二叉树,判断该二叉树是否为平衡二叉树(AVL树). 二.题解 <剑指offer>上给出了两种解决方式: 1.第一种是从根节点开始,从上往下遍历每个子节点并计算以子节点 ...