SPARSE 컬럼에 NULL 값이 입력되면 저장 공간을 전혀 차지 하지 않지만, NULL이 아닌 값이 저장될 경우에는 4byte의 추가 공간을 필요로합니다.
BOL에서는 SPARSE 컬럼의 사용으로 인해 20% ~ 40% 정도의 공간이 절약될 수 있다면 SPARSE 컬럼을 사용하라고 권고하는군요.
아래 표는 SPARSE 컬럼을 사용했을 때 40%의 공간을 절약하기 위해 필요한 NULL 값 비율을 데이터 타입 별로 나타내고 있습니다.
데이터 타입 |
NULL 비율 |
bit |
98% |
tinyint |
86% |
smallint |
76% |
int |
64% |
bigint |
52% |
real |
64% |
float |
52% |
smallmoney |
64% |
money |
52% |
smalldatetime |
64% |
datetime |
52% |
uniqueidentifier |
43% |
date |
69% |
datetime2(0) |
57% |
datetime2(7) |
52% |
time(0) |
69% |
time(7) |
60% |
datetimetoffset(0) |
52% |
datetimetoffset (7) |
49% |
decimal / numeric(1,s) |
60% |
decimal / numeric(38,s) |
42% |
varchar / char |
60% |
nvarchar / nchar |
60% |
varbinary / binary |
60% |
xml |
60% |
hierarchyid |
60% |
※ SPARSE 지정이 불가능한 데이터 타입
: geography, geometry, image, text, ntext, timestamp, UDT
용법 :
CREATE TABLE dbo.Demo (
docID int IDENTITY NOT NULL PRIMARY KEY,
title nvarchar(100) NOT NULL,
spec nvarchar(10) SPARSE NULL,
location int SPARSE NULL
);
SPARSE 컬럼은 NULL 이 아닌 값을 검색할 때 오버헤드가 있는데, 아래와 같이 NULL이 아닌 값만 필터링하여 인덱스를 생성하면 좋습니다.
CREATE INDEX IX_NN_Demo_location ON dbo.Demo (location) WHERE location IS NOT NULL;