SqlServer数据压缩测试

环境说明

操作系统:WIN SERVER 2012 R2 Standard
数据库系统: SQLSERVER 2016 SP1 Enterprise Evaluation Edition
硬件环境:CPU E7-8891 V3 2.79GHZ 80 CORES
内存 256GB

1.SqlServer数据压缩介绍

行压缩
启用压缩只会更改与数据类型相关联的数据的物理存储格式,而不会更改其语法或语义。 当对一个或多个表启用压缩时,不需要更改应用程序。
新的记录存储格式主要有以下更改:
1.减少了与记录相关联的元数据开销。 此元数据为有关列、列长度和偏移量的信息。 在某些情况下,元数据开销可能大于旧的存储格式。
2.对于数值类型(例如, integer、 decimal和 float)和基于数值的类型(例如, datetime 和 money)使用可变长度存储格式。
3.通过使用不存储空字符的可变长度格式来存储定长字符串。 页压缩
页压缩包含行压缩,以及前缀压缩和字典压缩,当使用页压缩时,将仅使用行压缩来压缩索引的非叶级别页,行压缩上面已经介绍.
页压缩对表、表分区、索引和索引分区都是类似的。
但对于字符串和其他数据类型而言,前缀压缩和字典压缩的原理都是相同的。 前缀压缩
对于要压缩的每一页,前缀压缩采用以下步骤:
1 对于每一列,将确定一个值,此值可用于减少每一列中的值的存储空间。
2 将创建表示每一列的前缀值的行,并将其存储在紧随页头之后的压缩信息(CI) 结构中。
3 列中重复的前缀值将由指向对应前缀的引用进行替换。如果行中的值与所选前缀值并不完全匹配,则仍会指示存在部分匹配。

2.创建表结构

#建立一个具有行压缩的表
use his;
/****** Object: Table [dbo].[test_compress] Script Date: 2018/3/7 13:46:43 ******/
SET ANSI_NULLS OFF
GO SET QUOTED_IDENTIFIER ON
GO CREATE TABLE [dbo].[test_compress_ROW](
...
...
...
CONSTRAINT [test_compress_ROW_pk] PRIMARY KEY CLUSTERED
(
...
...
...
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON
,DATA_COMPRESSION=ROW) --压缩选项
ON [PRIMARY]
) ON [PRIMARY] GO

3.测试非压缩表的性能

#可以用如下语句重新配置压缩选项,设置为不压缩
alter table [test_compress_ROW] rebuild with (data_compression=none) #模拟在非压缩表上插入100w条数据,并输出性能数据
set statistics io on
set statistics time on
insert into [test_compress_ROW]
select top 1000000 * from [dbo].[test_origin]
order by id SQL Server 分析和编译时间:
表 'test_compress_ROW'。扫描计数 0,逻辑读取 286554 次,物理读取 0 次,预读 0 次,
lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'test_origin'。扫描计数 1,逻辑读取 56317 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,
lob 物理读取 0 次,lob 预读 0 次。 SQL Server 执行时间:
CPU 时间 = 9407 毫秒,占用时间 = 12560 毫秒。 (1000000 行受影响) #查看非压缩表上的空间占用
exec sp_spaceused [test_compress_ROW] name rows reserved data index_size unused
test_compress_ROW 1000000 447648 KB 444448 KB 3032 KB 168 KB #前面的插入已经将数据写入到缓存,为了确保真实还原性能问题,我们需要关闭SQL Server自身的执行计划及缓存。清除缓存。
DBCC DROPCLEANBUFFERS --清除缓冲区
DBCC FREEPROCCACHE --删除计划高速缓存中的元素 #在非压缩表上执行select 并记录性能统计信息
#这里查询10000条数据作为例子,数据块多更能反映性能对比
select top 10000 * from test_compress_ROW SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 4 毫秒。 (10000 行受影响)
表 'test_compress_ROW'。扫描计数 1,逻辑读取 575 次,物理读取 1 次,预读 5424 次,
lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 SQL Server 执行时间:
CPU 时间 = 93 毫秒,占用时间 = 870 毫秒。

4. 测试行压缩表的性能

 #清空数据
truncate table [test_compress_ROW] #可以用如下语句重新配置压缩选项,设置为行压缩
alter table [test_compress_ROW] rebuild with (data_compression=row) #模拟在行压缩表上插入100w条数据,并输出性能数据
set statistics io on
set statistics time on
insert into [test_compress_ROW]
select top 1000000 * from [dbo].[test_origin]
order by [backupdate],[sysdate],[sno],[serverid] SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 9 毫秒。
表 'test_compress_ROW'。扫描计数 0,逻辑读取 107897 次,物理读取 0 次,预读 0 次,
lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'test_origin'。扫描计数 1,逻辑读取 56317 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,
lob 物理读取 0 次,lob 预读 0 次。 SQL Server 执行时间:
CPU 时间 = 7109 毫秒,占用时间 = 7314 毫秒。 (1000000 行受影响) #查看页压缩表上的空间占用
exec sp_spaceused [test_compress_ROW] name rows reserved data index_size unused
test_compress_ROW 1000000 128200 KB 127728 KB 408 KB 64 KB #前面的插入已经将数据写入到缓存,为了确保真实还原性能问题,我们需要关闭SQL Server自身的执行计划及缓存。清除缓存。
DBCC DROPCLEANBUFFERS --清除缓冲区
DBCC FREEPROCCACHE --删除计划高速缓存中的元素 #在页压缩表上执行select 并记录性能统计信息
#这里查询10000条数据作为例子,数据块多更能反映性能对比
select top 10000 * from test_compress_ROW SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 4 毫秒。 (10000 行受影响)
表 'test_compress_ROW'。扫描计数 1,逻辑读取 235 次,物理读取 1 次,预读 4952 次,
lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 SQL Server 执行时间:
CPU 时间 = 156 毫秒,占用时间 = 553 毫秒。

5.测试页压缩表的性能

 #清空数据
truncate table [test_compress_ROW] #可以用如下语句重新配置压缩选项,设置为行压缩
alter table [test_compress_ROW] rebuild with (data_compression=page) #模拟在页压缩表上插入100w条数据,并输出性能数据
set statistics io on
set statistics time on
insert into [test_compress_ROW]
select top 1000000 * from [dbo].[test_origin]
order by [backupdate],[sysdate],[sno],[serverid] SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 8 毫秒。
表 'test_compress_ROW'。扫描计数 0,逻辑读取 80357 次,物理读取 0 次,预读 0 次,
lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'test_origin'。扫描计数 1,逻辑读取 56317 次,物理读取 0 次,预读 0 次,
lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 SQL Server 执行时间:
CPU 时间 = 19156 毫秒,占用时间 = 19206 毫秒。 (1000000 行受影响) #查看页压缩表上的空间占用
exec sp_spaceused [test_compress_ROW] name rows reserved data index_size unused
test_compress_ROW 1000000 172232 KB 171600 KB 544 KB 88 KB #前面的插入已经将数据写入到缓存,为了确保真实还原性能问题,我们需要关闭SQL Server自身的执行计划及缓存。清除缓存。
DBCC DROPCLEANBUFFERS --清除缓冲区
DBCC FREEPROCCACHE --删除计划高速缓存中的元素 #在页压缩表上执行select 并记录性能统计信息
#这里查询10000条数据作为例子,数据块多更能反映性能对比
select top 10000 * from test_compress_ROW SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 4 毫秒。 (10000 行受影响)
表 'test_compress_ROW'。扫描计数 1,逻辑读取 172 次,物理读取 1 次,预读 5248 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 SQL Server 执行时间:
CPU 时间 = 203 毫秒,占用时间 = 834 毫秒。。

6.性能数据对比

6.1数据大小对比
无压缩 行压缩 行压缩比例 数据大小(页压缩) 页压缩比例
447648KB 172232KB 38.5% 128200KB 28.6%

可以看到:页压缩的数据压缩比更佳!

6.2 insert cpu性能对比
无压缩 行压缩 页压缩
CPU 时间 = 9407 毫秒 CPU 时间 = 7109 毫秒 CPU 时间 = 19156 毫秒

可以看到:写入数据时行压缩和页压缩都需要压缩操作,所以cpu占用明显要高出许多!页压缩的cpu占用明显要高出许多!

6.3 select cpu性能对比

无压缩 行压缩 页压缩
CPU 时间 = 93 毫秒 CPU 时间 = 156 毫秒 CPU 时间 = 203 毫秒

可以看到 读取数据时行压缩和页压缩都需要解压操作,所以cpu占用明显要高出许多!其中页压缩cpu最高!

6.3 select io性能对比

无压缩 行压缩 页压缩
逻辑读取 575 次,物理读取 1 次,预读 5424 次 逻辑读取 235 次,物理读取 1 次,预读 4952 次 逻辑读取 172 次,物理读取 1 次,预读 5248 次

可以看到 读取数据时行压缩和页压缩的逻辑读比非压缩的情况要优化很多,页压缩读取的数据块最少,io性能最好!

7.总结以及建议

1.与业务商定归档数据日期界限
2.拆分数据库,早于界限日期为节点归档历史数据,因为这部分数据属于静止冷数据,比较适合设置成为页压缩模式
3.定期将数据迁移到归档数据库
4.晚于界限日期的数据设置为行压缩模式,因为涉及到insert的问题
5.备份策略:完整--差异--日志

8.注意事项

1.数据压缩功能仅在SQLSERVER2008以后的企业版和开发版中可用

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

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

4.在未设置聚簇索引的表上设置页面压缩时,只有以下情况才会获得页面压缩的实际效果:
a.数据使用BULK INSERT语法添加到表中
b.数据使用INSERT INTO ... WITH (TABLOCK)语法添加到表中
c.执行带有页面压缩选项的ALTER TABLE ... REBUILD命令 5.在未设置聚簇索引的表上更改压缩选项,会导致该表上所有非聚簇索引都需要重建,因为这些非聚簇索引指向的数据行地址已经都发生了改变。 6.在改变压缩选项时所需要的临时空间大小与创建索引是所需要的空间是一样的,因此对于分区表,我们可以逐个分区设置压缩选项来减少临时空间的需求压力。 7.SQL Server 2008的压缩选项是工作在存储引擎层的,对于SQL Server的其他部件来说这一特性是透明的,因此当我们用BULK LOAD的方式
将外面的数据导入SQL Server时,会显著的增加CPU的工作载荷,同时将以压缩的数据表导出到外部文件时,可能会消耗比原来多很多的空间。

SqlServer数据压缩测试的更多相关文章

  1. SQLServer 脚本测试

    最近在做大数据同步的工作.很少数据需要特殊清洗算法,每次测试,都测试全部数据,浪费时间,可以只测试那些特殊数据即可(切记).

  2. sqlserver 时间测试

    select * from GropBy where [date] BETWEEN '2010-10' and '2015-10' --从字符串转换日期和/或时间时,转换失败. select * fr ...

  3. 解剖SQLSERVER 第十一篇 对SQLSERVER的多个版本进行自动化测试(译)

    解剖SQLSERVER 第十一篇    对SQLSERVER的多个版本进行自动化测试(译) http://improve.dk/automated-testing-of-orcamdf-against ...

  4. Dapper.Net 应用

    Dapper应用 1.Dapper是什么 Dapper是一款轻量级ORM工具.如果你在小的项目中,使用Entity Framework.NHibernate 来处理大数据访问及关系映射,未免有点杀鸡用 ...

  5. 用c#读取并分析sql2005日志

    用过logExplorer的朋友都会被他强悍的功能吸引,我写过一篇详细的操作文档可以参考http://blog.csdn.net/jinjazz/archive/2008/05/19/2459692. ...

  6. 通过sql做数据透视表,数据库表行列转换(pivot和Unpivot用法)(一)

    在mssql中大家都知道可以使用pivot来统计数据,实现像excel的透视表功能 一.MSsqlserver中我们通常的用法 1.Sqlserver数据库测试 ---创建测试表 Create tab ...

  7. c#读取并分析sql Server2005数据库日志

    用过logExplorer的朋友都会被他强悍的功能吸引,我写过一篇详细的操作文档可以参考http://blog.csdn.net/jinjazz/archive/2008/05/19/2459692. ...

  8. 基于Python的数据分析:数据库索引效率探究

    索引在数据库中是一个很特殊的存在,它的目的就是为了提高数据查询得效率.同样,它也有弊端,更新一个带索引的表的时间比更新一个没有带索引的时间更长.有得有失.我希望做一些研究测试,搞清楚索引对于我们使用数 ...

  9. SQL Server 对字符进行排序(数字类的字符)

    使用的是SQLserver数据库测试,其他数据库类似. 默认排序是按ID进行排序的 select stu_id ,stu_name from student order by stu_id. 现在需要 ...

随机推荐

  1. 同一台电脑的多ssh 配置

    转载自:https://w3ctrain.com/2016/03/06/mutiple-ssh-key/ ps:此文基于你已经能够正常的生成sshkey 对于sshkey的功能这里就不多做介绍了,本文 ...

  2. flash 一直在最上方,z-index无效

    设置embed的透明度 wmode="transparent" <embed src="http://player.youku.com/player.php/sid ...

  3. Codeforces 828C String Reconstruction【并查集巧妙运用】

    LINK 题目大意 给你n个串和在原串中的出现位置,问原串 思路 直接跑肯定是GG 考虑怎么优化 因为保证有解,所以考虑过的点我们就不再考虑 用并查集维护当前每个点之后最早的没有被更新过的点 然后就做 ...

  4. 20179223《Linux内核原理与分析》第十一周学习笔记

    缓冲区溢出漏洞实验 一.实验简介 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器和 ...

  5. 微软 Windows 系统检测网络连通性(用于显示感叹号)竟然是通过访问一个特殊网址来实现的

    一次我走到了弱网环境中,意外地发现浏览器打开了 http://www.msftconnecttest.com/redirect 网址,随后右下角的网络图标出现了一枚“感叹号”.   吹水的推断 从直观 ...

  6. B/S供应链(打印管理)问题答疑

    1.环境上的搭建答疑 .{"System.Data.OracleClient需要 Oracle 客户端软件 version 8.1.7或更高版本."} 解决:未装客户端,或所装版本 ...

  7. Protel 99 铺铜的一个坑 Pour Over Same

    Protel 99 铺铜的一个坑 Pour Over Same 好久没用 Protel 99 了,修改了一个旧的 PCB 文件. 需要修改线路,由于改了线路需要重新铺铜,得重新画铺铜的边框. 以下这个 ...

  8. 开始创建一个 Vue 项目

    开始创建一个 Vue 项目 安装 nodejs 略 安装 npm 默认安装时自带了 npm 安装 cnpm 为了更快的下载组件,使用cnpm,cnpm 是淘宝前端的镜像. 使用 npm 安装 cnpm ...

  9. PHP RSA加签的实现过程

    一.得到私钥文件mycert.key 2.从pfx提取密钥信息,并转换为key格式(pfx使用pkcs12模式补足) (1)提取密钥对 openssl pkcs12 -in 1.pfx -nocert ...

  10. bzoj5248(洛谷4363)(2018九省联考)一双木棋

    题目:https://www.luogu.org/problemnew/show/P4363 一种考虑状态数的方法:有几个用了k个格子的列,就在第k个0的左边插入几个1: 这也是求不降序列的个数的方法 ...