반응형
/********************************************************************************************
-- Title : [2k8] SPARSE NULL 컬럼 비교
-- Reference : tdon.blog.me
-- Key word : sparse not null sp_spaceused 스파스
********************************************************************************************/

-- SSAS로 많이 문의 드렸던 과거 필라넷의 권0돈 주임님.
-- 어디론가 이직하셨다는데..
-- 우얏든, SPARSE 컬럼은 고정길이 NULL허용 필드에 쓰면 좋다.

-- 제약사항
  ㅇ not null은 지원하지 않음
  ㅇ geography, geometry, image, ntext, text, timestamp, 사용자 정의 형식은 지원하지 않음.
-- SPARSE 컬럼에 지원되지 않는 사항
  ㅇ ROWGUIDCOL 또는 IDENTITY
  ㅇ 기본값을 사용할 수 없음
  ㅇ 클러스터 인덱스나 유니크 인덱스의 일부가 될 수 없음
  ㅇ 파티션 키로 사용될 수 없음
  ㅇ 사용자 정의 형식

USE tempdb;
GO
/*
-- 가변길이 NULL SPARSE 비교
*/
DROP TABLE tbl_non_sparse, tbl_sparse;

-- null 테이블 생성
CREATE TABLE tbl_non_sparse
( id INT NOT NULL IDENTITY PRIMARY KEY
, seq INT NOT NULL
, num NVARCHAR(20) NULL
);

-- sparse 테이블 생성
CREATE TABLE tbl_sparse
( id INT NOT NULL IDENTITY PRIMARY KEY
, seq INT NOT NULL
, num NVARCHAR(20) SPARSE NULL
);

-- null 테이블에 100만건 저장
WITH cte_temp(num)
AS
( SELECT 1 "num"
  UNION ALL
  SELECT num + 1 FROM cte_temp WHERE num + 1 <= 100
)
INSERT INTO tbl_non_sparse
SELECT A.num, NULL FROM cte_temp A
CROSS JOIN cte_temp B
CROSS JOIN cte_temp C;

-- sparse 테이블에 100만건 저장
WITH cte_temp(num)
AS
( SELECT 1 "num"
  UNION ALL
  SELECT num + 1 FROM cte_temp WHERE num + 1 <= 100
)
INSERT INTO tbl_sparse
SELECT A.num, NULL FROM cte_temp A
CROSS JOIN cte_temp B
CROSS JOIN cte_temp C;

-- 공간 비교(동일)
EXEC sp_spaceused 'tbl_non_sparse';
EXEC sp_spaceused 'tbl_sparse';

/*
-- 고정길이 NULL SPARSE 비교
*/
DROP TABLE tbl_non_sparse, tbl_sparse;

-- null 테이블 생성
CREATE TABLE tbl_non_sparse
( id INT NOT NULL IDENTITY PRIMARY KEY
, seq INT NOT NULL
, num NCHAR(20) NULL
);

-- sparse 테이블 생성
CREATE TABLE tbl_sparse
( id INT NOT NULL IDENTITY PRIMARY KEY
, seq INT NOT NULL
, num NCHAR(20) SPARSE NULL
);

-- null 테이블에 100만건 저장
WITH cte_temp(num)
AS
( SELECT 1 "num"
  UNION ALL
  SELECT num + 1 FROM cte_temp WHERE num + 1 <= 100
)
INSERT INTO tbl_non_sparse
SELECT A.num, NULL FROM cte_temp A
CROSS JOIN cte_temp B
CROSS JOIN cte_temp C;

-- sparse 테이블에 100만건 저장
WITH cte_temp(num)
AS
( SELECT 1 "num"
  UNION ALL
  SELECT num + 1 FROM cte_temp WHERE num + 1 <= 100
)
INSERT INTO tbl_sparse
SELECT A.num, NULL FROM cte_temp A
CROSS JOIN cte_temp B
CROSS JOIN cte_temp C;

-- 공간 비교(차이 남)
EXEC sp_spaceused 'tbl_non_sparse';
EXEC sp_spaceused 'tbl_sparse';

반응형

+ Recent posts