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都有值 | 6408 | 6400 | 8 | 0 |
5128 | 5096 | 8 | 24 | |
VARCHAR都有值 | 2312 | 2288 | 8 | 16 |
1160 | 1144 | 8 | 8 | |
CHAR都NULL | 1160 | 1144 | 8 | 8 |
5128 | 5096 | 8 | 24 | |
VARCHAR都NULL | 1160 | 1144 | 8 | 8 |
1160 | 1144 | 8 | 8 | |
CHAR一邊NULL | 3976 | 3944 | 8 | 24 |
一邊有值 | 5128 | 5096 | 8 | 24 |
VARCHAR一邊 | 1928 | 1872 | 8 | 8 |
NULL一邊有值 | 1160 | 1144 | 8 | 8 |
*有值的部份是填入空白值,而非填滿,故在CHAR時是補滿,而VARCHAR時理應空白。
*欄位裡上面為有使用SPARSE的TABLE,下面為沒使用的TABLE。
在這裡看到,當都是使用CHAR時,若資料欄位都有儲存資料且非有NULL時,所使用的空間會變多,在VARCHAR時亦同,而當CHAR都是NULL時,可以發現佔用的空間明顯變少了,但在VARCHAR時則相等,所以可以發現在VARCHAR為NULL時,有無使用SPARSE似乎都沒有意義,在一邊有值一邊為NULL的情況下,可以發現CHAR的確有省到空間,但是VARCHAR依舊是佔用較多空間。
故使用SPARSE時,由於SPARSE的特性是,若欄位為NULL時將不佔任何空間(不替它保留),但在有資料時則額外佔用空間(聽說是4byte),所以在使用變動欄位(如VARCHAR),除了不會省到任何空間以外,反而可能會膨賬,但在固定欄位時則相反。