在創(chuàng)建表或索引,或者修改表或索引時(shí)可以啟用行壓縮特性。壓縮可以基于行級(jí)、頁(yè)面級(jí)和備份級(jí),本文將舉例說(shuō)明如何創(chuàng)建一個(gè)具備行壓縮功能的表,以及修改一個(gè)表,使其具備行壓縮功能。
首先創(chuàng)建一個(gè)未開(kāi)啟行壓縮功能的表,使用下面的SQL語(yǔ)句往表里插入一些數(shù)據(jù):
/****** 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語(yǔ)句查詢這個(gè)表占用的空間大小:
EXEC sp_spaceused [NONCompressed Table]
返回結(jié)果:
name,rows,reserved,data,index_size,unused
NoNCompressed Table,30003 ,968 KB,944 KB,8 KB,16 KB
現(xiàn)在我們創(chuàng)建一個(gè)啟用了行壓縮的表,使用下面的SQL語(yǔ)句插入相同數(shù)量的數(shù)據(jù):
/****** 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語(yǔ)句查詢表的空間占用情況:
EXEC sp_spaceused [Compressed Table]
返回結(jié)果:
name,rows,reserved,data,index_size,unused
Compressed Table,30003 ,584 KB,576 KB,8 KB,0 KB
結(jié)果顯示壓縮表比非壓縮表占用的空間小得多。
有一種情況是表中已經(jīng)有很多數(shù)據(jù),但現(xiàn)在需要進(jìn)行壓縮,該怎么辦呢?在這種情況下,可以ALTER TABLE語(yǔ)句增加數(shù)據(jù)壓縮功能,我們創(chuàng)建另一個(gè)未啟用壓縮功能的表來(lái)模擬一下,使用下面的SQL語(yǔ)句添加數(shù)據(jù)到表中:
/****** 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語(yǔ)句查詢?cè)摫碚加玫目臻g大小:
EXEC sp_spaceused [NONCompressed Table2]
返回結(jié)果:
name,rows,reserved,data,index_size,unused
NoNCompressed Table,30003 ,968 KB,944 KB,8 KB,16 KB
使用下面的ALTER TABLE語(yǔ)句啟用表的壓縮功能:
ALTER TABLE [NoNCompressed Table2]
REBUILD WITH (DATA_COMPRESSION = ROW );
然后使用下面的SQL語(yǔ)句查詢表的空間占用情況:
EXEC sp_spaceused [NONCompressed Table2]
返回結(jié)果:
name,rows,reserved,data,index_size,unused
NoNCompressed Table2,30003 ,592 KB,560 KB,8 KB,24 KB