希格工作室

2011年9月19日 星期一

SQL SERVER手記 --- SPARSE



USE [tempdb] 
create table tst1 (ss varchar(20) SPARSE,ss1 varchar(20) SPARSE)
CREATE TABLE tst2 (ss varchar(20)       ,ss1 varchar(20) )
go

--select * from tst1 SPARSE 
--go

declare @idx int = 0
while @idx < 100000
begin
insert tst1 values('',null) 
insert tst2 values('',null)
set @idx +=1
end
go

sp_spaceused tst1
go

sp_spaceused tst2
go

drop table tst1,tst2
go



測試輸入10萬筆資料,每筆資料有兩個欄位,長度都為20

有/無(SPARSE)保留區資料區索引區未使用
CHAR都有值6408640080
51285096824
VARCHAR都有值23122288816
1160114488
CHAR都NULL1160114488
51285096824
VARCHAR都NULL1160114488
1160114488
CHAR一邊NULL39763944824
一邊有值51285096824
VARCHAR一邊1928187288
NULL一邊有值1160114488

*有值的部份是填入空白值,而非填滿,故在CHAR時是補滿,而VARCHAR時理應空白。
*欄位裡上面為有使用SPARSE的TABLE,下面為沒使用的TABLE。

在這裡看到,當都是使用CHAR時,若資料欄位都有儲存資料且非有NULL時,所使用的空間會變多,在VARCHAR時亦同,而當CHAR都是NULL時,可以發現佔用的空間明顯變少了,但在VARCHAR時則相等,所以可以發現在VARCHAR為NULL時,有無使用SPARSE似乎都沒有意義,在一邊有值一邊為NULL的情況下,可以發現CHAR的確有省到空間,但是VARCHAR依舊是佔用較多空間。

故使用SPARSE時,由於SPARSE的特性是,若欄位為NULL時將不佔任何空間(不替它保留),但在有資料時則額外佔用空間(聽說是4byte),所以在使用變動欄位(如VARCHAR),除了不會省到任何空間以外,反而可能會膨賬,但在固定欄位時則相反。

沒有留言:

張貼留言