본문 바로가기

SQL Server/SQL Server Tip & Tech

SPARSE 컬럼

테이블에서 NULL 값을 허용하는 컬럼에 사용하는 옵션으로 SPARSE 가 있습니다. [SQL Server 2008]

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;