分类: 数据库开发技术
2010-03-10 15:22:46
微软在SQL Server 2008中推出了页面压缩。这个新特性在企业版和开发版本中都提供了。SQL Server的页面压缩特性可以压缩整个页面。
页面压缩只适用于当页面是完整的时候。当发生页面压缩时,以下面的顺序发生三个操作:
记录压缩
前缀压缩
字典压缩
让我们使用下面的事务SQL语句创建一个没有压缩选项的表,并给它添加一些数据:
/****** Object: Table [dbo].[NoNCompressed Table] Script Date: 06/12/2009 02:24:23 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[NoNCompressed Table]') AND type in (N'U')) DROP TABLE [dbo].[NoNCompressed Table] GO CREATE TABLE [NoNCompressed Table] (id int, FName char(100), LName char(100)) -- Add 10,000 rows declare @n int set @n=0 while @n<=10000 begin insert into [NoNCompressed Table] values (1,'Adam','Smith'),(2,'Maria','carter'), (3,'Walter','zenegger'),(4,'Marianne','smithsonian') set @n=@n+1 end GO 现在让我们使用下面的事务SQL语句来查询这个表所使用的空间。 EXEC sp_spaceused [NONCompressed Table] |
name,rows,reserved,data,index_size,unused
NoNCompressed Table,40004,8456 KB,8424 KB,8 KB,24 KB
让我们使用下面的事务SQL语句来创建一个具有压缩的表,并给它添加相同数量的数据:
/****** Object: Table [dbo].[Compressed Table] Script Date: 06/12/2009 02:24:57 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Compressed Table]') AND type in (N'U')) DROP TABLE [dbo].[Compressed Table] GO CREATE TABLE [Compressed Table] (id int, FName char(100), LName char(100)) with (Data_compression = PAGE) declare @n int set @n=0 -- Add 10,000 rows while @n<=10000 begin insert into [Compressed Table] values (1,'Adam','Smith'),(2,'Maria','carter'), (3,'Walter','zenegger'),(4,'Marianne','smithsonian') set @n=@n+1 end GO 使用下面的事务SQL语句查询这个表所使用的空间。 EXEC sp_spaceused [Compressed Table] 结果 name,rows,reserved,data,index_size,unused Compressed Table,40004, 904 KB,896 KB,8 KB,0 KB |
如果你想估计压缩的大小,你可以使用下面的命令来进行估计。
Exec sp_estimate_data_compression_savings 'dbo','NoNCompressed Table',NULL,NULL,'PAGE'
Exec sp_estimate_data_compression_savings 'dbo','NoNCompressed Table',NULL,NULL,'ROW'
当这个过程执行时,这个存储过程取样数据,并将数据加载到tempdb数据库中。然后在tempdb 数据库中压缩这个表来显示估计。
有时这个表已经有大量数据了,而你需要压缩这个表。在这种情况下,你可以使用ALTER TABLE语句来添加数据压缩。让我们创建另一个没有压缩的表来模拟这种场景。还有,我们要使用下面的事务SQL语句来添加一些类似于上面所使用的数据:
/****** Object: Table [dbo].[NoNCompressed Table] Script Date: 06/12/2009 02:24:23 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[NoNCompressed Table2]') AND type in (N'U')) DROP TABLE [dbo].[NoNCompressed Table2] GO CREATE TABLE [NoNCompressed Table2] (id int, FName char(100), LName char(100)) declare @n int set @n=0 while @n<=10000 begin insert into [NoNCompressed Table2] values (1,'Adam','Smith'),(2,'Maria','carter'), (3,'Walter','zenegger'),(4,'Marianne','smithsonian') set @n=@n+1 end GO 使用下面的事务SQL语句来查询这个表所使用的空间。 EXEC sp_spaceused [NONCompressed Table2] 结果 name,rows,reserved,data,index_size,unused NoNCompressed Table2,40004, 8456 KB,8424 KB,8 KB,24 KB 使用ALTER TABLE语句来添加数据压缩特性到这个表,如下所示。 ALTER TABLE [NoNCompressed Table2] REBUILD WITH (DATA_COMPRESSION = PAGE ); |
EXEC sp_spaceused [NONCompressed Table2]
结果
name,rows,reserved,data,index_size,unused
NoNCompressed Table2,40004, 592 KB,472 KB,8 KB,112 KB
还有可能你需要创建一个使用数据压缩的索引。让我们比较下未压缩聚集和非聚集索引的表和压缩聚集和非聚集索引的表的大小。
使用下面的事务SQL语句来创建一个没有压缩、具有大量数据的表:
/****** Object: Table [dbo].[NoNCompressed Table3] Script Date: 06/13/2009 02:24:23 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[NoNCompressed Table3]') AND type in (N'U'))
DROP TABLE [dbo].[NoNCompressed Table3]
GO
CREATE TABLE [NoNCompressed Table3]
(id int, FName char(100), LName char(100))
declare @n int
set @n=0
while @n<=10000
begin
insert into [NoNCompressed Table3] values
(1,'Adam','Smith'),(2,'Maria','carter'),(3,'Walter','zenegger')
set @n=@n+1
end
GO
现在让我们使用下面的事务SQL语句来查询这个表所使用的空间。
EXEC sp_spaceused [NONCompressed Table3]
结果
name,rows,reserved,data,index_size,unused
NoNCompressed Table3,30003, 6472 KB,6408 KB,8 KB,56 KB
使用下面的事务SQL语句在这个表上添加一个聚集索引。
create clustered index [NoNCompressed Table3_Cl_Idx] on
[NoNCompressed Table3](ID)
使用下面的事务SQL语句来查询这个表所使用的空间。
EXEC sp_spaceused [NONCompressed Table3]
结果
name,rows,reserved,data,index_size,unused
NoNCompressed Table3,30003, 6784 KB,6672 KB,64 KB48 KB
使用下面的事务SQL语句对这个表添加一个非聚集索引。
create Nonclustered index [NoNCompressed Table3_NonCl_Idx] on
[NoNCompressed Table3](Fname)
现在让我们使用下面的事务SQL语句来查询这个表所使用的空间。
EXEC sp_spaceused [NONCompressed Table3]
结果
name,rows,reserved,data,index_size,unused
NoNCompressed Table3,30003,10656 KB, 6672 KB,3752 KB,232 KB
现在让我们使用下面的TSQL语句给上面的表添加压缩特性。
ALTER TABLE [NoNCompressed Table3]
REBUILD WITH (DATA_COMPRESSION = PAGE );
ALTER INDEX [NoNCompressed Table3_Cl_Idx] on [NoNCompressed Table3]
REBUILD WITH (DATA_COMPRESSION = PAGE );
ALTER INDEX [NoNCompressed Table3_NonCl_Idx] on [NoNCompressed Table3]
REBUILD WITH (DATA_COMPRESSION = PAGE );
使用下面的事务SQL语句查询这个表所使用的空间。
EXEC sp_spaceused [NONCompressed Table3]
结果
name,rows,reserved,data,index_size,unused
NoNCompressed Table3,30003, 808 KB,336 KB,320 KB,152 KB
从【NONCompressed Table3】在改变这个表前后的空间使用结果来看,你可以知道对索引的页面压缩进行得很好。