Oracle/Administration2018. 10. 17. 13:04

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개의 행이 선택되었습니다.


  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
Posted by 정희락_