SQL SERVER 数据压缩

从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

 

--未完待续

参考链接:http://msdn.microsoft.com/zh-cn/library/cc280449.aspx

 

 

惯例上图引狼

转载于:https://www.cnblogs.com/TeyGao/p/3545004.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294251.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言基本数据类型short、int、long、char、float、double

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程 1.概述 C 语言包含的数据类型如下图所示 2.各种数据类型介绍 2.1整型 整形包括短整型、整形和长整形。 2.1.1短整形 short a=1; 2.1.2整形 一般占4个字节(32位),…

是的,我打败了一个奥特曼。

全世界只有3.14 % 的人关注了爆炸吧知识春节将至&#xff0c;超模君给各位带来了春节好礼——《数学之旅闪耀人类的54位数学家》文化礼盒&#xff0c;集结阿基米德、欧几里得、芝诺、高斯、欧拉等54位数学家&#xff0c;跨越2600年的数学之旅&#xff0c;为各位新一年的学习之旅…

你有多少个前男友?

1 给我整不会了&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 这是送分题还是送命题&#xff1f;▼3 有梦想谁都了不起&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 &#xff1f;&#xff1f;&#xff08;via.偷听bot&#xff0c;侵删&#xff09;…

里程碑!中文版.NET官网发布,.NET开发起飞!

重磅官宣&#xff0c;微软.NET官网正式发布简体中⽂版&#xff0c;而且是官方支持语言第一梯队&#xff0c;由此可见微软对中国.NET市场的重视。这些年&#xff0c;微软一直在加大.NET在中国的支持和推广&#xff0c;努力让更多传统行业、互联网公司、创业团队的中国开发者选择…

来一个可能防止恶意采集和爬虫的SH

没办法&#xff0c;公司的要求&#xff0c;还有&#xff0c;一些山寨爬虫完全不够我们运维人员的感觉&#xff0c; 一天爬虫搞个三四十万的LOG&#xff0c;那我只好干了。。 人家GOOGLE&#xff0c;BAIDU&#xff0c;一天大约也就五六千吧。。 有一个小的SSH技巧&#xff0c;是…

面对焦虑,我们能做什么?

全世界只有3.14 % 的人关注了爆炸吧知识你在犹豫&#xff0c;你在抱怨&#xff0c;你埋怨这个社会的不公平&#xff1b;你埋怨自己的运气不好&#xff0c;你埋怨付出了得不到结果。其实你只是还不够努力。从此刻起开始改变自己一切还来得及。从现在开始&#xff0c;你有多努力就…

验证规则构建神器 FluentValidation.md

上一篇文章《MediatR在.NET应用中的实践》中&#xff0c;我们在讲MediatR的管线内容时&#xff0c;提到过可以在管线中增加 Command/Query 的验证。今天我来带领大家了解一个.NET技术领域中很「流行」的强类型验证规则构建库&#xff1a;FluentValidation。FluentValidation 简…

基本排序算法一

一 选择排序 原理&#xff1a;选择排序很简单&#xff0c;他的步骤如下&#xff1a; 从左至右遍历&#xff0c;找到最小(大)的元素&#xff0c;然后与第一个元素交换。从剩余未排序元素中继续寻找最小&#xff08;大&#xff09;元素&#xff0c;然后与第二个元素进行交换。以此…

老大爷的手法一看就不一般!

1 超市门口的双枪老大爷▼2 小朋友&#xff1a;谢邀&#xff0c;人在机场&#xff0c;刚下飞船▼3 向你保证这真的是一副刺绣作品▼4 外国最新挑战【我打我自己接力】▼5 疫情期间在家隔离的健身人士们快要被逼疯了▼6 给大家表演一个大变活人吧▼7 家有神兽的家长最近一…

Gamebryo实例学习之二BackgroundLoad

2019独角兽企业重金招聘Python工程师标准>>> 一、简介 后台加载允许应用程序以一个优先级低于主线程的后台线程来加载NIF文件。这个程序演示了如何使用BackgroundLoad后台加载。 二、解析 程序继承了实例基类NiSample。 CallbackStream继…

WPF 实现圣诞树

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织由于微信群人数太多入群请添加小编微信号&#xff08;yanjinhuawechat&#xff09;或&#xff08;W_Feng_aiQ&#xff09;邀请入群&#xff08;需备注WPF开发者&#xff09;PS&#xff1a;有更好的…

sdut2784cf 126b Good Luck!(next数组)

链接 next数组的巧妙应用 学弟出给学弟的学弟的题。。 求最长的 是前缀也是后缀同时也是中缀的串 next的数组求的就是最长的前后缀 但是却不能求得中缀 所以这里 就把尾部去掉之后再求 这样就可以保证是中缀了 先把所有既是前缀也是后缀的长度的求出来标记 然后再去掉尾部 求…

聊一聊基于Nacos的metadata完成服务间的AB测试

背景 在很多时候&#xff0c;产品同学或其他 boss 会有一些想法&#xff0c;或好或坏&#xff0c;都会想放到线上环境去验证&#xff0c;看看能不能带来更好的效果。这其实就是一个提出假设和验证假设的过程&#xff0c;而 AB 测试&#xff0c;是验证假设的好方法。对于服务之间…

豆瓣评分9分+,每一部看完不禁感慨!这里是神州大地!

全世界只有3.14 % 的人关注了爆炸吧知识纪录片的一大重要意义&#xff0c;就在于它能将我们的视野和脚步&#xff0c;引向我们无法企及的地方和领域&#xff0c;又能让那些我们曾经到过的地方、经历过的人事&#xff0c;变得更有深意。今天&#xff0c;就给大家分享7部顶级纪录…

旅游社交网站 游范儿

为什么80%的码农都做不了架构师&#xff1f;>>> 应用名称&#xff1a;旅游社交网站 游范儿 应用URL地址&#xff1a;http://tumi.cloudfoundry.com/ 应用说明及使用场景&#xff1a; 用于爱好旅游的人士&#xff0c;发游记&#xff0c;以及所见所闻&#xff0c;…

nginx源码学习Unix - Unix域协议

说到什么是域协议就会出现这么个解释&#xff1a; UNIX域协议并不是一个实际的协议族&#xff0c;而是在单个主机上执行客户/服务器通信的一种方法&#xff0c;所用API与在不同主机上执行客户/服务器通信所使用的API相同。UNIX域协议可以视为IPC方法之一。 我们白话解释下Unix域…

oracle12c考试内容,12c ocp考试内容

oca1z0-047(Oracle Database SQL Expert 1Z0-047) 60个题&#xff0c;90分钟&#xff0c;66%过关。/1z0-051(Oracle Database 11g: SQL Fundamentals I 1Z0-051) 64个题&#xff0c;120分钟&#xff0c;60%过关。/1z0-061(Oracle Database 12c: SQL Fundamentals 1Z0-061) 75个…

微软开源的Web测试和自动化神器 Playwright

Playwright 是微软开源的一个用于 Web 测试和自动化的框架, 提供了可靠的端到端测试, 功能非常强大, 可以在测试, 爬虫&#xff0c;自动化场景中使用。跨浏览器Playwright 支持所有现代的渲染引擎&#xff0c;包括 Chromium、WebKit 和 Firefox。跨平台在 Windows, Linux 和 ma…

史上最厉害的“1+2”!这个270年前出现的大难题,已经60多年没有出现好消息了..........

全世界只有3.14 % 的人关注了爆炸吧知识费马费马欧拉欧拉数学是科学的皇后数论是数学中的皇冠这顶皇冠每一次被举起它的光芒都在照亮数学的前方从112到“12”人类一次次逼近“哥德巴赫猜想”的真相从一张白纸到上面写满n>2的证明“费马大定理”凝聚成了一部数学史从2、3、5、…

放寒假的硕博研究生将经历什么?

全世界只有3.14 % 的人关注了爆炸吧知识1月中下旬基本全国的高校都放假了&#xff0c;除了部分因为疫情滞留在学校和外地的学生&#xff0c;绝大多数的学生都会回家过年。平时自带学霸光环&#xff0c;可以借口工作学业繁忙&#xff0c;不回家&#xff0c;不用应酬&#xff0c;…