SQL SERVER ->> Data Compression

最近做了一个关于数据压缩的项目,要把整个SQL SERVER服务器下所有的表对象要改成页压缩。于是趁此机会了解了一下SQL SERVER下压缩技术。

这篇文章几乎就是完全指导手册了

https://technet.microsoft.com/en-us/library/dd894051(v=sql.100).aspx

当然这里还有技术wiki page

https://msdn.microsoft.com/en-us/library/cc280449.aspx

那看了这么多,这里总结一下:

1)SQL SERVER下一共有两种压缩类型:Row Compression和Page Compression

2)Row Compression把固定长度的数据列存成可变长度的格式,然后每列取4位(bits)来记录数据的长度,NULL和0除了那4位对数据存储空间不做任何影响。翻译过来是这样,但其实还是不是很懂。然而Page Compression则易懂得多了,前缀压缩和字典压缩技术。先进行前缀压缩,然后对整个页面进行字典压缩达到压缩比的最大化。

3)想知道一个数据库是否已经应用了压缩,查下这张DMV:select * from sys.dm_db_persisted_sku_features;

4)预估空间上的节省(Estimated space savings)

这个存储过程可以用来预估单张表大概可以节省多少数据库存储空间:sp_estimate_data_compression_savings. 整个计算过程是取样放到tempdb下而不是全表扫描。

5)什么样的数据压缩比率最大最有效?空值,大部分空间都用不到的固定长度数据(字符或者数字),前缀值重复率高的数据。

6)压缩对LOB、ROW_OVERFLOW数据页和FILESTREAM数据不奏效

7)压缩完的数据页从磁盘读进内存是不解压的,数据页只有在参与排序(sort)、连接(Join)、筛选(filter)或者被更新的时候才会被解压缩

8)解压缩的过程并非说在内存里面复制出另外一份数据来解压缩,而是用CPU计算后解压。

9)压缩技术对于表扫描的作用显然要比查找大,这样才能体现出在大存储空间下压缩对IO优化的优势

10)那么按理来说,压缩提升了IO和内存,以CPU作为代价。而Row Compression的CPU代价显然要比Page Compression要低,但是Page Compression的压缩比要更高。文章中说到Row Compression仅比没压缩的CPU多出10 percent,我没有实际测试过。

11)对于Page Compression,建议是用在那些少更新的大表、服务器上CPU的占用还算低的情况下。而虽然前面提到了数据页在参与排序(sort)、连接(Join)、筛选(filter)或者被更新的时候才会被解压缩,但是文章中提到了如果查询语句的本身就存在复杂的聚合运行逻辑和连接,那压缩对其造成的影响将不是一个大的方面。其实按道理来讲,可以说压缩技术即便消耗了更多的CPU资源,但是考虑到在一个大的压缩比的前提下,即便参与数据在参与聚合或者连接的时候需要被解压缩,但是这一切毕竟是在内存里面,比起没有压缩的页面需要重新被读取到内存里面(一般情况下,如果是数据仓库的话,数据页面很难停留在内存里面太久),我想要更划算,毕竟内存的读写能力和磁盘的读写能力不是能相提并论的。

12)那是决定Row Compression还是Page Compression?原则是U(update)和S(scan)。被更新得越频繁的表越适合Row Compression,更多参与查询的表越适合Page Compression。不过我觉得,这个还要更数据量的大小有关。比如如果某张表的数据量非常大,10几个G或者数亿行数据行的数据量的话,Page Compression的高压缩比的优势太大了。下列语句可以查出数据库中表更新和扫描的频率

--Update
SELECT o.name AS [Table_Name], x.name AS [Index_Name],
       i.partition_number AS [Partition],
       i.index_id AS [Index_ID], x.type_desc AS [Index_Type],
       i.leaf_update_count * 100.0 /
           (i.range_scan_count + i.leaf_insert_count
            + i.leaf_delete_count + i.leaf_update_count
            + i.leaf_page_merge_count + i.singleton_lookup_count
           ) AS [Percent_Update]
FROM sys.dm_db_index_operational_stats (db_id(), NULL, NULL, NULL) i
JOIN sys.objects o ON o.object_id = i.object_id
JOIN sys.indexes x ON x.object_id = i.object_id AND x.index_id = i.index_id
WHERE (i.range_scan_count + i.leaf_insert_count
       + i.leaf_delete_count + leaf_update_count
       + i.leaf_page_merge_count + i.singleton_lookup_count) != 0
AND objectproperty(i.object_id,‘IsUserTable‘) = 1
ORDER BY [Percent_Update] ASC

--Scan
SELECT o.name AS [Table_Name], x.name AS [Index_Name],
       i.partition_number AS [Partition],
       i.index_id AS [Index_ID], x.type_desc AS [Index_Type],
       i.range_scan_count * 100.0 /
           (i.range_scan_count + i.leaf_insert_count
            + i.leaf_delete_count + i.leaf_update_count
            + i.leaf_page_merge_count + i.singleton_lookup_count
           ) AS [Percent_Scan]
FROM sys.dm_db_index_operational_stats (db_id(), NULL, NULL, NULL) i
JOIN sys.objects o ON o.object_id = i.object_id
JOIN sys.indexes x ON x.object_id = i.object_id AND x.index_id = i.index_id
WHERE (i.range_scan_count + i.leaf_insert_count
       + i.leaf_delete_count + leaf_update_count
       + i.leaf_page_merge_count + i.singleton_lookup_count) != 0
AND objectproperty(i.object_id,‘IsUserTable‘) = 1
ORDER BY [Percent_Scan] DESC

那么如果要压缩,需要注意些什么呢?或者说对系统有哪些影响呢?

压缩都是通过REBUILD INDEX来完成。

SORT_IN_TEMPDB选项影响tempdb的空间增长

ONLINE影响用户数据库的空间增长和事务日志文件大小的增长

RECOVERY MODE影响事务日志文件大小的增长

表或者索引在被压缩的过程中,旧的索引在被替换前是和被压缩后的索引同时存在用户数据库里面的,替换后才把空间还给文件组,那么最起码一条索引所需要的空间只是索引现有空间大小+(索引现有空间大小-savings)

Online选项会消耗更多的CPU

对于tempdb空间增长的影响,

如果RECOVERY MODE是SIMPLE,每次CHECK

时间: 2024-10-15 19:00:05

SQL SERVER ->> Data Compression的相关文章

Sql Server Data compression 预估和选择,以及查看成功压缩的数据页

Sql Server提供两种数据压缩的方式:row压缩和page压缩.两种压缩的内部原理暂且不论,只要知道压缩率越高,节省的disk space 更多即可.sql server 提供多种工具,供DBA查看压缩的效率. 1,查看表的压缩类型 在sys.partitions中的两个字段data_compression 和data_compression_desc ,Indicates the state of compression for each partition. 使用sys.allocat

SQL Server Data Tools 开发 微软Dynamics 2015 报表开发 入门

打开 SQL Server Data Tools 界面如下: 其实就是Visual studio 新建一个项目,我们还是基于.net framework 4.0吧 新建数据源: 可以点测试连接, 1ms的反应时间啊,很快的. 下面就是开始 添加新报表了,右键 报表, 选择第一个菜单, "添加新报表" 本人就选了CRM中产品的表, select name,price,productionumber from productbase 可以选择表格,或者矩阵.具体可以点一下,看是什么样式的呢

接着上一篇,把刚才SQL Server Data Tools 开发的报表复制到 重新部署到微软Dynamics CRM 系统中

报表开发好了,要应用到系统中呢,下面教大家如何把Visual studio或者SQL Server Data Tools 开发的报表导入到系统中. 进入, 销售---报表 ,点 新建 点 "浏览" 定位到报表保存的文件夹.一般在我的文档中 Projects 点 "保存并关闭" 好了,看到了吧,分配权限就可以使用了,是不是很简单啊. 下面是逆向操作,报表导出. 保存即可以.

报错:此版本的SQL Server Data Tools与此计算机中安装的数据库运行时组件不兼容

在Visual Studio 2012中使用Entity Framework,根据模型生成数据库时,报如下错误: 无法在自定义编辑器中打开Transact-SQL文件此版本的SQL Server Data Tools与此计算机中安装的数据库运行时组件不兼容 解决办法:下载"Server Data Tools for Visual Studio 2012" ,并安装,重新启动Visual Studio 2012.

Microsoft SQL Server Data Tools - Business Intelligence for Visual Studio 2013 http://www.microsoft.com/en-us/download/details.aspx?id=42313

Microsoft SQL Server Data Tools - Business Intelligence for Visual Studio 2013 http://www.microsoft.com/en-us/download/details.aspx?id=42313

SQL Server -- 下载 SQL Server Data Tools (SSDT)

https://docs.microsoft.com/zh-cn/sql/ssdt/download-sql-server-data-tools-ssdt SQL Server Data Tools 是一款可免费下载的现×××发工具,用于生成 SQL Server 关系数据库.Azure SQL 数据库.Integration Services 包.Analysis Services 数据模型和 Reporting Services 报表. 使用 SSDT,你可以设计和部署任何 SQL Serv

C++: read SQL server data using System::Data::SqlClient

stdafx.h: // stdafx.h : include file for standard system include files, // or project specific include files that are used frequently, but // are changed infrequently #pragma once #using <mscorlib.dll> #using <System.dll> #using <System.Dat

Microsoft SQL Server Data Tools - Business Intelligence for Visual Studio 2013 SSIS

VS2012 SSDTBI_VS2012_x86_CHS.exe http://www.microsoft.com/zh-CN/download/details.aspx?id=36843 VS2013 SSDTBI_x86_CHS.exe http://www.microsoft.com/zh-cn/download/details.aspx?id=42313&751be11f-ede8-5a0c-058c-2ee190a24fa6=True VS2015

2012 里SQL Server Data Tools进程处理数据库时 怎么没有更改设置呢?

在处理ssas时,如果遇到垃圾数据需要忽略的时候操作方法: 下图是处理ssas时垃圾数据的提示: 1.由于屏幕分辨率的问题,需要把窗口拖大才能看到更改设置按钮 2.