八、IO优化(4)数据压缩

本文介绍SQLServer2008的数据压缩功能,包括行压缩和页压缩两种方式,以及如何通过这些压缩方式提升磁盘I/O效率。文章还详细介绍了压缩的具体实现过程,包括启用压缩的方法及注意事项。

一、概述

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,这是原始值。

113111954.png

(3)字典压缩

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

113546432.png

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


说明

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

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


三、压缩表和索引

1.估算压缩结果

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


2. 启用压缩

(1) SSMS

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

114633225.png

115219546.png

115222108.png

115224507.png

115226277.png

115229693.png


(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效率。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值