淺談SQL Server 2008中的行壓縮

iSQlServer發表於2009-08-10

在建立表或索引,或者修改表或索引時可以啟用行壓縮特性。壓縮可以基於行級、頁面級和備份級,本文將舉例說明如何建立一個具備行壓縮功能的表,以及修改一個表,使其具備行壓縮功能。

首先建立一個未開啟行壓縮功能的表,使用下面的SQL語句往表裡插入一些資料:

  1. /****** Object: Table [dbo].[NoNCompressed Table]  
  2. Script Date: 05/27/2009 02:24:23 ******/  
  3. IF EXISTS (SELECT * FROM sys.objects  
  4. WHERE object_id = OBJECT_ID(N'[dbo].[NoNCompressed Table]')  
  5. AND type in (N'U'))  
  6. DROP TABLE [dbo].[NoNCompressed Table]  
  7. GO  
  8. CREATE TABLE [NoNCompressed Table]  
  9. (id int, FName varchar(100), LName varchar(100))  
  10. --增加10,000行  
  11. declare @n int  
  12. set @n=0 
  13. while @n<=10000  
  14. begin  
  15. insert into [NoNCompressed Table] values  
  16. (1,'Adam','Smith'),(2,'Maria','carter'),(3,'Walter','zenegger')  
  17. set @n=@n+1  
  18. end  
  19. GO 

然後使用下面的SQL語句查詢這個表佔用的空間大小:

  1. EXEC sp_spaceused [NONCompressed Table] 

返回結果:

  1. name,rows,reserved,data,index_size,unused  
  2. NoNCompressed Table,30003 ,968 KB,944 KB,8 KB,16 KB 

現在我們建立一個啟用了行壓縮的表,使用下面的SQL語句插入相同數量的資料:

  1. /****** Object: Table [dbo].[Compressed Table]  
  2. Script Date: 05/27/2009 02:24:57 ******/  
  3. IF EXISTS (SELECT * FROM sys.objects  
  4. WHERE object_id = OBJECT_ID(N'[dbo].[Compressed Table]')  
  5. AND type in (N'U'))  
  6. DROP TABLE [dbo].[Compressed Table]  
  7. GO  
  8. CREATE TABLE [Compressed Table]  
  9. (id int, FName varchar(100), LName varchar(100)) with  
  10. (Data_compression = ROW)  
  11. declare @n int  
  12. set @n=0 
  13. --新增10,000行  
  14. while @n<=10000  
  15. begin  
  16. insert into [Compressed Table] values  
  17. (1,'Adam','Smith'),(2,'Maria','carter'),(3,'Walter','zenegger')  
  18. set @n=@n+1  
  19. end  
  20. GO 

使用下面的SQL語句查詢表的空間佔用情況:

EXEC sp_spaceused [Compressed Table]

返回結果:

name,rows,reserved,data,index_size,unused

Compressed Table,30003 ,584 KB,576 KB,8 KB,0 KB

結果顯示壓縮表比非壓縮表佔用的空間小得多。

有一種情況是表中已經有很多資料,但現在需要進行壓縮,該怎麼辦呢?在這種情況下,可以ALTER TABLE語句增加資料壓縮功能,我們建立另一個未啟用壓縮功能的表來模擬一下,使用下面的SQL語句新增資料到表中:

  1. /****** Object: Table [dbo].[NoNCompressed Table] Script Date: 05/27/2009 02:24:23 ******/  
  2. IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[NoNCompressed Table2]') AND type in (N'U'))  
  3. DROP TABLE [dbo].[NoNCompressed Table2]  
  4. GO  
  5. CREATE TABLE [NoNCompressed Table2]  
  6. (id int, FName varchar(100), LName varchar(100))  
  7. declare @n int  
  8. set @n=0 
  9. while @n<=10000  
  10. begin  
  11. insert into [NoNCompressed Table2] values  
  12. (1,'Adam','Smith'),(2,'Maria','carter'),(3,'Walter','zenegger')  
  13. set @n=@n+1  
  14. end  
  15. GO 

使用下面的SQL語句查詢該表佔用的空間大小:

  1. EXEC sp_spaceused [NONCompressed Table2] 

返回結果:

  1. name,rows,reserved,data,index_size,unused  
  2. NoNCompressed Table,30003 ,968 KB,944 KB,8 KB,16 KB 

使用下面的ALTER TABLE語句啟用表的壓縮功能:

  1. ALTER TABLE [NoNCompressed Table2]  
  2. REBUILD WITH (DATA_COMPRESSION = ROW ); 

然後使用下面的SQL語句查詢表的空間佔用情況:

  1. EXEC sp_spaceused [NONCompressed Table2] 

返回結果:

name,rows,reserved,data,index_size,unused

NoNCompressed Table2,30003 ,592 KB,560 KB,8 KB,24 KB

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-611776/,如需轉載,請註明出處,否則將追究法律責任。

相關文章