SQL SERVER2008的数据压缩与备份压缩功能

 

我们先来看看Microsoft book online里给出的说明:

SQL Server 2008 支持表和索引的行压缩和页压缩。可以为以下数据库对象配置数据压缩:

 

u        存储为堆的整个表。

u        存储为聚集索引的整个表。

u        整个非聚集索引。

u        整个索引视图。

 

对于已分区表和已分区索引,可为每个分区配置压缩选项,且对象的各个分区的压缩设置不必相同。

 

表的压缩设置不自动应用于它的非聚集索引。必须单独设置每个索引。压缩功能不可用于系统表。如果表和索引是使用CREATE TABLE 和CREATE INDEX 语句创建的,则可以压缩。若要更改表、索引或分区的压缩状态,请使用ALTER TABLE 或ALTER INDEX 语句。

 

简单地说,这以功能使得SOL Server 2008允许在表、索引和分区中执行数据压缩,这样不仅可以节省磁盘空间,而且允许更多数据装入RAM中,提升查询的性能。通过测试发现,在生产环境中,新的压缩技术可以把表的大小减少到原容量的15%~5O%。可见,这一个功能在实战中还是非常有用的。SQL Server 2008中的数据压缩有两种应用方式,即行压缩和页压缩。

 

Demo:示例演示行压缩和页压缩

 

USE AdventureWorks 

GO 

--创建压缩测试表

CREATE TABLE TestCompression (col1 INT, col2 CHAR(50)) 

GO

--写入5000笔测试数据

INSERT INTO TestCompression VALUES (10, 'compression testing text') 

GO 5000 

-- 默认不压缩时的情况

EXEC sp_spaceused TestCompression 

GO 

-- 测试启用行压缩时的情况

ALTER TABLE TestCompression 

REBUILD WITH (DATA_COMPRESSION = ROW); 

GO 

EXEC sp_spaceused TestCompression 

GO 

-- 测试启用页压缩时的情况

ALTER TABLE TestCompression 

REBUILD WITH (DATA_COMPRESSION = PAGE); 

GO 

EXEC sp_spaceused TestCompression 

GO 

-- 改回无压缩状态

ALTER TABLE TestCompression 

REBUILD WITH (DATA_COMPRESSION = NONE); 

GO 

EXEC sp_spaceused TestCompression 

GO

/*

有图有真相,上图看各种压缩对比分析

*/

 

--估算AdventureWorks 数据库中的Production.WorkOrderRouting 表在使用ROW 压缩进行压缩后的大小。

USE AdventureWorks

GO

EXEC sp_estimate_data_compression_savings 'Production', 'WorkOrderRouting', NULL, NULL, 'ROW' ;

GO               


 

下面的示例用来测试当table创建聚集索引后分别启用行压缩和页压缩的情况

 


create table testcompression  (

       part varchar(30),

       description varchar(60),

       specification varchar(60),

       constraint pk_testcompression primary key clustered

       (part asc ))

       

       declare @part varchar(30),@description varchar(60),@specification varchar(60),@cnt int

       set @cnt=1

       while @cnt<=5000

       begin

       insert into testcompression

       select left(CONVERT(varchar(256),NEWID()),30),left(CONVERT(varchar(256),NEWID()),60),left(CONVERT(varchar(256),NEWID()),60)

       set @cnt=@cnt+1

       end

       go

       --查询数据

       select * from testcompression

       go

       --带索引时默认不压缩

       sp_spaceused 'testcompression'

       --带索引行压缩

       alter table testcompression

       rebuild with (DATA_COMPRESSION = ROW)

       go

       sp_spaceused 'testcompression'

       GO

       --带索引时页压缩

       alter table testcompression

       rebuild with (DATA_COMPRESSION = PAGE)

       go

       sp_spaceused 'testcompression'

       

       /*对比分析

       name             rows      reserved  data index_size unused

       testcompression 5000       904 KB 888 KB 16 KB  0 KB--不带压缩

       testcompression 5000        656 KB 584 KB 16 KB  56 KB--行压缩

       testcompression 5000       656 KB 584 KB 16 KB  56 KB--页压缩

       

       */


 

SQL SERVER 2008不仅能够对数据库对象进行压缩,还可以在数据库备份时进行备份压缩,只要在备份时加参数COMPRESSION 即可进行备份压缩。

备份压缩示例代码:

 

BACKUP DATABASE [AdventureWorks] TO  DISK = N'C:\Backup\AdventureWorks.bak' WITH NOFORMAT, NOINIT,  NAME = N'AdventureWorks-完整数据库备份', SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10

GO

 


 

备份压缩可以大大减小数据库备份文件的大小,由于降低了备份时的I/O,所以进行备份压缩通常可以提高备份的速度。

 

备份压缩是用CPU换空间,虽然减少了存储空间大小,但是在备份和还原时将消耗更多的CPU。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值