博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
八、IO优化(4)数据压缩
阅读量:6151 次
发布时间:2019-06-21

本文共 2033 字,大约阅读时间需要 6 分钟。

一、概述

1. 为何需要数据压缩

  SQL Server的性能主要取决于磁盘I/O效率,提高I/O效率某种程序上就意味着提高性能。SQL Server 2008提供了数据压缩功能来提高磁盘I/O。

  数据压缩意味着减小数据的有磁盘占用量,所以数据压缩可以用在表,聚集索引,非聚集索引,视图索引或是分区表,分区索引上。

2. 启用压缩

  启用压缩只会更改与数据类型相关联的数据的物理存储格式,而不会更改其语法或语义。当对一个或多个表启用压缩时,不需要更改应用程序。

二、实现数据压缩

  数据压缩可以在两个级别上实现:行级别和页级别。

页级别压缩包括行级别压缩。

1. 行压缩

  新的记录存储格式主要有以下更改:

(1)减少了与记录相关联的元数据开销。此元数据为有关列、列长度和偏移量的信息。在某些情况下,元数据开销可能大于旧的存储格式。

(2)它对于数值类型(例如,integer、decimal 和 float)和基于数值的类型(例如,datetime 和 money)使用可变长度存储格式。

(3)它通过使用不存储空字符的可变长度格式来存储定长字符串。

(4)将对所有数据类型的 NULL 和 0 值进行优化,从而使它们不占用任何字节。

2. 页压缩

  使用页压缩压缩表和索引的叶级别的过程由按以下顺序进行的三个操作组成:

(1)行压缩

(2)前缀压缩

  以表的页压缩为例,如下图所示,左侧显示了前缀压缩之前表的一个示例页,右侧则显示的是同一页在前缀压缩之后的样子。可以看到,前缀移至页头,列值更改为指向前缀的引用。在第一行的第一列,值 4b 指示为该行显示前缀的前四个字符 (aaab) 和字符 b。这样的话,结果值就是 aaabb,这是原始值。

(3)字典压缩

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

请注意,值 4b 已由页的其他列引用。

说明

(1)表、表分区、索引和索引分区的页压缩都是类似的。

(2)当使用页压缩时,将仅使用行压缩来压缩索引的非叶级别页。

三、压缩表和索引

1.估算压缩结果

  若要确定更改压缩状态将对表或索引有何影响,请使用 sp_estimate_data_compression_savings 存储过程。

2. 启用压缩

(1) SSMS

  可以通过SSMS更改表和压缩选项。

(2)T-SQL

  表和索引在创建的同时就可以压缩。

CREATE TABLE T1

(c1 int, c2 nvarchar(50) )

WITH ( DATA_COMPRESSION = ROW )

  也可以使用Alter Table Rebuild With 或是 Alter Index Rebuild With语法压缩已存在表或是索引。

USE [db01]

ALTER TABLE [dbo].[EmpTable2] REBUILD PARTITION = ALL

WITH ( DATA_COMPRESSION = PAGE )

3. 新页的压缩

  当创建具有页压缩的新表时,不会进行压缩。但是,表的元数据会指示应使用页压缩。当将数据添加到第一个数据页时,会对数据进行行压缩。因为此页未满,所以无法通过页压缩获得任何益处。如果页已满,则添加下一行将引导页压缩操作。将查看整个页;计算每一列以进行前缀压缩,然后计算所有列以进行字典压缩。如果页压缩已在页上为要添加的行创建了足够的空间,则添加该行,并对数据进行行压缩和页压缩。如果通过页压缩获得的空间减去 CI 结构所需空间之后剩余的空间并不充足,则不会对此页使用页压缩。以后,行将添加到新页上,如果新页中也无法再容纳更多的行,则将再向表中添加一个新页。与第一页类似,新页最初也不进行页压缩。

  当包含数据的现有表转换为页压缩时,将重新生成和计算每一页。重新生成所有页会导致重新生成表、索引或分区。

四、注意事项

  使用行压缩和页压缩时,应注意以下事项:

(1)只有在 SQL Server 2008以上的版本,Enterprise Edition 和 Developer Edition 中才能使用压缩。

(2)通过压缩可在一页上存储更多的行,但不会更改表或索引的最大行大小。

(3)当最大行大小加上压缩开销超过最大行大小 8060 个字节时,不能对表启用压缩功能。

(4)非聚集索引不继承表的压缩属性。若要压缩索引,必须显式设置索引的压缩属性。默认情况下,在创建索引时,索引的压缩设置将设置为 NONE。

(5)若要更改堆的压缩设置,要求对表重新生成所有非聚集索引,以便它们具有指向堆中的新行位置的指针。

本文结语:

  通过数据压缩,减少I/O压力,提高I/O效率。

转载地址:http://csgya.baihongyu.com/

你可能感兴趣的文章
centos 下安装g++
查看>>
嵌入式,代码调试----GDB扫盲
查看>>
类斐波那契数列的奇妙性质
查看>>
下一步工作分配
查看>>
Response. AppendHeader使用大全及文件下载.net函数使用注意点(转载)
查看>>
Wait Functions
查看>>
jQuery最佳实践
查看>>
centos64i386下apache 403没有权限访问。
查看>>
jquery用法大全
查看>>
PC-BSD 9.2 发布,基于 FreeBSD 9.2
查看>>
网卡驱动程序之框架(一)
查看>>
css斜线
查看>>
Windows phone 8 学习笔记(3) 通信
查看>>
Revit API找到风管穿过的墙(当前文档和链接文档)
查看>>
Scroll Depth – 衡量页面滚动的 Google 分析插件
查看>>
Windows 8.1 应用再出发 - 视图状态的更新
查看>>
自己制作交叉编译工具链
查看>>
Qt Style Sheet实践(四):行文本编辑框QLineEdit及自动补全
查看>>
[物理学与PDEs]第3章习题1 只有一个非零分量的磁场
查看>>
深入浅出NodeJS——数据通信,NET模块运行机制
查看>>