在創建表或索引,或者修改表或索引時可以啟用行壓縮特性。壓縮可以基於行級、頁面級和備份級,本文將舉例說明如何創建一個具備行壓縮功能的表,以及修改一個表,使其具備行壓縮功能。
首先創建一個未開啟行壓縮功能的表,使用下面的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))
--增加10,000行
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
--添加10,000行
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