码迷,mamicode.com
首页 > 其他好文 > 详细

表数据压缩

时间:2015-06-15 18:14:19      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:

对于行存储的表和索引,使用数据压缩功能可帮助减小数据库的大小。 除了节省空间之外,数据压缩还可以帮助提高 I/O 密集型工作负荷的性能,因为数据存储在更少的页中,查询需要从磁盘读取的页更少。 但是,在与应用程序交换数据时,在数据库服务器上需要额外的 CPU 资源来压缩和解压缩数据

1,在表的storage 选项卡查看表的存储属性

技术分享

2,sp_estimate_data_compression_savings 估算压缩的效果

使用 sp_estimate_data_compression_savings 估算对表或分区启用行压缩或页压缩时可能带来的节省量。

EXEC SYS.sp_estimate_data_compression_savings

       @SCHEMA_NAME=dbo,

       @OBJECT_NAME=table_name,

       @INDEX_ID=NULL,

       @PARTITION_NUMBER=NULL,

       @DATA_COMPRESSION=ROW

3, 压缩存在额外的开销

当最大行大小加上压缩开销超过最大行大小 8060 个字节时,不能对表启用压缩功能。例如,不能压缩具有 c1 char(8000) 和 c2 char(53) 列的表,因为存在额外的压缩开销

4,Row 压缩的实现 

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

  • 减少了与记录相关联的元数据开销。此元数据为有关列、列长度和偏移量的信息。 在某些情况下,元数据开销可能大于旧的存储格式。
  • 它对于数值类型(例如,integer、decimal 和 float)和基于数值的类型(例如,datetime 和 money)使用可变长度存储格式。 
  • 它通过使用不存储空字符的可变长度格式来存储定长字符串。

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

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

  • 对于数值类型和基于数值的类型来说,数据类型的长度是一定的,如BIGINT占用8个字节,但对于值1来说,只需要一个字节便可以存放,启用行压缩便可以节省7个字节的空间;
  • 对于定长字符串类型,如果存放的数据未达到指定长度,会补空字符来填满,如类型CHAR(200)用来存放字符串"1"会花费200个字节,但启用行压缩后,会将填充的空字符移除,只需要1个字节便可以存放。
  • 对于类型bit来说,除自身消耗的空间外,还需要额外的4个bit来存放元数据,因此也可以从行压缩中获益。

5,Page 压缩的实现

页压缩包含行压缩,以及前缀压缩和字典压缩,当使用页压缩时,将仅使用行压缩来压缩索引的非叶级别页.

6,通过ssms对表开启压缩功能

通过表的存储来Manage Compression,select compression type

技术分享

技术分享

7,写脚本对表开启压缩功能

 可以预先评估一下压缩的数据量的大小,然后再进行压缩

EXEC sp_estimate_data_compression_savings 
    @schema_name = dbo, 
    @object_name = hierarchy,
    @index_id = null, 
    @partition_number = NULL, 
    @data_compression = row‘ ; 
ALTER TABLE [dbo].[hierarchy] REBUILD PARTITION = ALL
WITH (DATA_COMPRESSION = ROW )

8,对索引开启page压缩功能

SELECT name, index_id
FROM sys.indexes
WHERE OBJECT_NAME (object_id) = NTransactionHistory;

EXEC sp_estimate_data_compression_savings 
    @schema_name = Production, 
    @object_name = TransactionHistory,
    @index_id = 2, 
    @partition_number = NULL, 
    @data_compression = PAGE ; 

ALTER INDEX IX_TransactionHistory_ProductID ON Production.TransactionHistory 
REBUILD PARTITION = ALL
WITH (DATA_COMPRESSION = PAGE); GO

 

表数据压缩

标签:

原文地址:http://www.cnblogs.com/ljhdo/p/4577994.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!