程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL Server 2008中的行壓縮淺析

SQL Server 2008中的行壓縮淺析

編輯:關於SqlServer

  在創建表或索引或當在改變一個索引或表時可以激活行壓縮。

  壓縮可以是在行級別、頁面級別和備份級別。在這篇文章中,我們將介紹怎樣創建一個使用行壓縮的表,並改變這個表及對它添加壓縮。

  讓我們使用下面的事務SQL語句來創建一個沒有壓縮選項的表並對它添加一些數據:

  /****** Object: Table [dbo].[NoNCompressed Table]

  Script Date: 05/27/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 varchar(100), LName varchar(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')

  set @n=@n+1

  end

  GO

  現在讓我們使用下面的事務SQL語句來查詢這個表所使用的空間。

  EXEC sp_spaceused [NONCompressed Table]

  結果

  name,rows,reserved,data,index_size,unused

  NoNCompressed Table,30003 ,968 KB,944 KB,8 KB,16 KB

  現在讓我們使用下面的事務SQL語句來創建一個具有壓縮的表並對它添加相同數量的數據:

        /****** Object: Table [dbo].[Compressed Table]

  Script Date: 05/27/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 varchar(100), LName varchar(100)) with

  (Data_compression = ROW)

  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')

  set @n=@n+1

  end

  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語句來添加一些與上面所使用的數據類似的數據:

  /****** Object: Table [dbo].[NoNCompressed Table] Script Date: 05/27/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 varchar(100), LName varchar(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')

  set @n=@n+1

  end

  GO

  使用下面的事務SQL語句來查詢這個表所使用的空間。

  EXEC sp_spaceused [NONCompressed Table2]

  結果

  name,rows,reserved,data,index_size,unused

  NoNCompressed Table,30003 ,968 KB,944 KB,8 KB,16 KB

  使用ALTER TABLE語句對這個表添加數據壓縮特性,如下所示。

  ALTER TABLE [NoNCompressed Table2]

  REBUILD WITH (DATA_COMPRESSION = ROW );

  現在讓我們使用下面的事務SQL語句來查詢這個表所使用的空間。

  EXEC sp_spaceused [NONCompressed Table2]

  結果

  name,rows,reserved,data,index_size,unused

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

  有時你需要創建一個使用數據壓縮的索引。讓我們比較具有非壓縮聚集和非聚集索引的表的大小與具有壓縮聚集和非聚集索引的表的大小。

  使用下面的事務SQL語句來創建一個沒有壓縮而有大量數據的表:

  /****** Object: Table [dbo].[NoNCompressed Table3] Script Date: 05/27/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 varchar(100), LName varchar(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 Table,30003 ,968 KB,944 KB,8 KB,16 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 ,1256 KB,1096 KB,64 KB,96 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 ,2096 KB,1096 KB,824 KB,176 KB



  使用下面的事務SQL語句來創建一個沒有壓縮而有大量數據的類似表:

        /****** Object: Table [dbo].[NoNCompressed Table4] Script Date: 05/27/2009 02:24:23 ******/

  IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[NoNCompressed Table4]') AND type in (N'U'))

  DROP TABLE [dbo].[NoNCompressed Table4]

  GO

  CREATE TABLE [NoNCompressed Table4]

  (id int, FName varchar(100), LName varchar(100))

  declare @n int

  set @n=0

  while @n<=10000

  begin

  insert into [NoNCompressed Table4] values

  (1,'Adam','Smith'),(2,'Maria','carter'),(3,'Walter','zenegger')

  set @n=@n+1

  end

  GO

  現在讓我們使用下面的事務SQL語句給這個具有壓縮的表添加一個聚集索引。

  create clustered index [NoNCompressed Table4_Cl_Idx] on

  [NoNCompressed Table4](ID)

  with (data_compression = ROW)

  使用下面的事務SQL語句來查詢這個表所使用的空間。

  EXEC sp_spaceused [NONCompressed Table4]

  結果

  name,rows,reserved,data,index_size,unused

  NoNCompressed Table4,30003 ,744 KB,616 KB,64 KB,64 KB

  使用下面的事務SQL語句給這個表添加一個具有壓縮的非聚集索引。

  create Nonclustered index [NoNCompressed Table4_NonCl_Idx] on

  [NoNCompressed Table4](Fname)

  with (data_compression = ROW)

  使用下面的事務SQL語句來查詢這個表所使用的空間。


  EXEC sp_spaceused [NONCompressed Table4]

  結果

  name,rows,reserved,data,index_size,unused

  NoNCompressed Table4,30003 ,1264 KB,616 KB,496 KB,152 KB

  從[NONCompressed Table4] 和[NONCompressed Table3]的空間使用結果,你可以看到索引上的行壓縮也工作得很好。

  總結

  這篇文章介紹了怎樣激活表和索引的行數據壓縮。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved