CHAR(1) vs VARCHAR2(1)에 대한 내용은 데이터 모델링 분야의 매우 오래된 논란 중 하나다. 많은 이유로 VARCHAR2 타입을 사용하는 편이 유리하지만 아직도 특정한 경우에는 CHAR 타입을 사용해야 한다는 의견도 있다. 그 중 하나가 길이 1자리인 경우 CHAR 타입이 VARCHAR2 타입보다 유리하다라는 주장이다.
테스트를 위해 아래와 같이 테이블을 생성하자. t1, t2에 각각 천만 건의 데이터를 삽입했다.
-- 1 DROP TABLE t1 PURGE; DROP TABLE t2 PURGE; CREATE TABLE t1 AS SELECT 'X' AS c1 FROM XMLTABLE ('1 to 10000000'); CREATE TABLE t2 AS SELECT CAST (c1 AS VARCHAR2(1)) AS c1 FROM t1;
*_SEGMENTS 뷰를 조회해보면 VARCHAR2 타입을 사용한 t2의 크기가 7MB만큼 더 큰 것을 확인할 수 있다. 1
-- 2-1 SELECT segment_name, segment_subtype, bytes, blocks, extents FROM user_segments WHERE segment_name IN ('T1', 'T2'); SEGMENT_NAME SEGMENT_SUBTYPE BYTES BLOCKS EXTENTS ------------ --------------- --------- ------ ------- T1 ASSM 126877696 15488 87 T2 ASSM 134217728 16384 87 2 행이 선택되었습니다. -- 2-2 SELECT (134217728 - 126877696) / POWER (1024, 2) AS mb FROM DUAL; MB -- 7 1개의 행이 선택되었습니다.
DBMS_SPACE.UNUSED_SPACE 프로시저로 상세한 내용을 살펴보면 Unused Bytes에 차이가 존재하는 것을 확인할 수 있다. Unused Bytes를 감안해서 다시 계산하면 차이가 24KB로 줄어든다. 24KB의 용도는 알 필요가 없다. 천만 건에 24KB라면 10억 건을 가정한다고 하더라도 약 2.34MB의 용량을 추가로 사용하는 것이다.
-- 3-1 NAME T1 T2 ------------- --------- --------- Total Blocks 15488 16384 Total Bytes 126877696 134217728 Unused Blocks 103 996 Unused Bytes 843776 8159232 -- 3-2 SELECT ((134217728 - 8159232) - (126877696 - 843776)) / 1024 AS kb FROM DUAL; KB -- 24 1개의 행이 선택되었습니다.
- 백만 건을 입력한 경우 크기가 동일했다. [본문으로]
'Oracle > Administration' 카테고리의 다른 글
오브젝트 명의 고유성 (0) | 2018.11.15 |
---|---|
인덱스 생성 제약 (0) | 2018.10.19 |
히든 파라미터 조회 뷰 생성 (0) | 2018.10.16 |
인덱스 브랜치 블록 (0) | 2018.10.09 |
Online Statistics Gathering for Bulk Loads (0) | 2018.09.29 |