关键概念
配置数据压缩可以通过SSMS和T-SQL语句两种方式来实现。
表和索引压缩
对于行存储表和索引,使用数据压缩功能可帮助减小数据库的大小。 除了节省空间之外,数据压缩还可以帮助提高 I/O 密集型工作负荷的性能,因为数据存储在更少的页中,查询需要从磁盘读取的页更少。 但是,在与应用程序交换数据时,在数据库服务器上需要额外的 CPU 资源来压缩和解压缩数据。
对于列存储表和索引,所有列存储表和索引始终使用列存储压缩,并且用户无法对此进行配置。 在您能够付出额外的时间和 CPU 资源来存储和检索数据的情况下,使用列存储存档压缩可进一步减少数据大小。
行压缩和页压缩
启用压缩只会更改与数据类型相关联的数据的物理存储格式,而不会更改其语法或语义。
行压缩的实现:http://msdn.microsoft.com/zh-cn/library/cc280576.aspx
表、表分区、索引和索引分区的页压缩都是类似的。
页压缩的实现:http://msdn.microsoft.com/zh-cn/library/cc280464.aspx
sp_estimate_data_compression_savings
返回所请求对象的当前大小并估算对象在所请求的压缩状态下的大小。 可对所有表或部分表评估压缩。 这包括堆、聚集索引、非聚集索引、索引视图以及表和索引分区。 可使用行压缩或页压缩来压缩这些对象。 如果表、索引或分区已经过压缩,则可使用该过程来估计在重新压缩的情况下该表、索引或分区的大小。
可使用 sp_estimate_data_compression_savings 估算对表或分区启用行压缩或页压缩时可能带来的节省量。 例如,如果行的平均大小可以减少 40%,则可能可以将对象大小减少 40%。 您可能无法节省空间,因为这取决于填充因子和行大小。 例如,如果某行长度为 8000 字节并且您将该行的大小减少 40%,则数据页上仍只能容纳一行。 因此不会节省空间。
如果运行 sp_estimate_data_compression_savings 的结果指示表的大小将增长,则表示表中的许多行使用的几乎是数据类型的完全精度,因而为满足压缩格式的需要而增加的少量开销大于该压缩所带来的节省量。 在这种极个别的情况下,请不要启用压缩。
如果对表启用压缩,请使用 sp_estimate_data_compression_savings 估算在未压缩该表的情况下该行的平均大小。
在此操作期间将获取该表的 (IS) 锁。 如果不能获取 (IS) 锁,则该过程将被阻止。 该表将在已提交读隔离级别下进行扫描。
如果请求的压缩设置与当前的压缩设置相同,则该存储过程将返回在没有数据碎片且使用现有填充因子时的估计大小。
如果索引或分区 ID 不存在,将不返回任何结果。
参考:http://msdn.microsoft.com/zh-cn/library/cc280574.aspx
节省磁盘IO和内存
Unicode压缩
SQL Server 使用 Unicode 标准压缩方案 (Standard Compression Scheme for Unicode, SCSU) 算法实现来压缩在行或页压缩对象中存储的 Unicode 值。 对于这些压缩对象,Unicode 压缩对于 nchar(n) 和 nvarchar(n) 列而言是自动的。 数据库引擎 将 Unicode 数据存储为 2 个字节,无论区域设置如何。 这称为 UCS-2 编码。 对于某些区域设置而言,在 SQL Server 中实现 SCSU 压缩可节省高达 50% 的存储空间。