Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2594657
  • 博文数量: 2110
  • 博客积分: 18861
  • 博客等级: 上将
  • 技术积分: 24420
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-05 18:23
文章分类

全部博文(2110)

文章存档

2011年(139)

2010年(1971)

我的朋友

分类: 数据库开发技术

2010-03-10 15:22:46

 SQL Server 7.0发布的时候,SQL Server中的页面大小是2K;现在页面大小是8K。

  微软在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 );
  让我们使用下面的事务SQL语句来查询这个表所使用的空间。

  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】在改变这个表前后的空间使用结果来看,你可以知道对索引的页面压缩进行得很好。

阅读(398) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~