对于行存储(相比列存储)的表和索引,启用数据压缩最直接效果是能够减小数据占用的存储空间的大小;除了节省空间之外,数据压缩还能提高 I/O 密集型查询的性能,因为数据存储在更少的数据页(Data Page)中,SQL Server需要从磁盘读取的数据页更少,数据从Disk加载到内存的速度更快,查询的性能更好。但是,压缩和解压缩的过程都需要消耗额外的CPU资源,开发者必须均衡CPU资源,数据存储和硬盘IO的开销。

SQL Server提供两种数据压缩方式:行(Row)压缩和页压缩(Page),用于压缩表或索引数据,数据压缩对应用程序是透明的。

一,行压缩

行压缩(Row Compression)是将固定长度类型存储为可变长度存储类型,行压缩是自动进行的,对应用程序不可见,应用程序不需要做任何修改。

1,对于字符型

Char(200),这是一个固定长度的数据类型,但是在实际存储的时候,可能不会存储200个字符。在物理存储数据时,SQL Server后补空格以达到200个字符。如果将其转换为varchar(200),不需要后补空格,节省存储空间。

2,对于数值型

在SQL Server 2005 SP2之前,decimal类型总是以固定数据存储的。根据值的精确度,每个decimal值都需要5到17字节的空间。新引入的Vardecimal存储格式是把decimal值以一个可变长度的格式进行存储。这种格式把小数值前后的零都去除,可以减少存储所需的空间。

SOL Server 2008数据压缩扩展了这个功能,对所有固定长度的数据类型都进行了处理,包括integer、char和float。现在数据不是以固定大小的字节进行存储,而是用最小所需的字节。开发者不需要修改数据类型,只需要启用行压缩功能,SOL Server 2008及其之后的版本就会使用最小的可变数据类型来存储数据。

3,行压缩无法处理XML、BLOB和MAX数据类型

4,行压缩的实现 

启用行压缩只会更改与数据类型相关联的数据的物理存储格式,将固定长度的类型修改为可变长度的类型进行存储,而不会更改其语法或语义。新的记录存储格式主要有以下更改:

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

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

  • 它通过使用不存储空字符的可变长度格式来存储定长字符串。例如,将char 修改为varchar;

实现的原理,通俗解释是通过修改物理存储格式,将定长类型转换为变长类型,达到压缩数据的目的,但是物理存储格式的修改不会影响该字段使用的语法,例如:

    网友评论