사이즈 추정하기
작성: 김도근
물리 모델 단계에서 로우 사이즈 예측하기가 힘들때가 많다. variable 사이즈를 많이 쓴다면 그에 대한 최대값과 최소값의 편차가 심할 가능성이 크다. 예전에 자료를 만든 'Oracle 9i 의 물리 설계' 를 토대로 예측을 해보자.
데이터 형 |
고정/가변 |
데이터 저장 시의 길이 |
CHAR |
고정/가변 |
· 바이트수 지정시는 테이블이 정의한 길이의 고정 길이 · 문자 수지정시는 문자 수에 대해서 고정이지만 실점유 바이트 수는 캐릭터 셋 및 실제의 데이터에 의해 다르다. 예를 들면KO16KSC5601의 DB로 「char(6 char)」의 컬럼에 「AAA」라고하는 데이터를 넣으면 3바이트 소비되지만 「하하하」라고 하는 2바이트 한글 데이터를 넣으면 6바이트를 소모한다. |
VARCHAR2 |
가변 |
실제로 저장되고 있는 데이터의 길이(바이트 수 지정시 문자수지정시 ) |
NCHAR |
고정 |
테이블 정의 지정 문자수의 두배(AL32UTF8 지정시) |
NVARCHAR2 |
가변 |
저장 문자수의 2배(AL32UTF8 지정시) |
NUMBER |
가변 |
길이 = 1 + CEIL (n / 2) · CEIL는 올림 값 (예: ceil(1.2) = 2 ) · n는 저장된 수치의 정수부 및 소수부를 합한 총자리수. n>38의 경우에는38 이다 · 유효 자리수 38자리수 미만의 음수의 경우는 1바이트 더한다. |
DATE |
고정 |
7 바이트 |
TIMESTAMP |
가변 |
초의 소수부분에 데이터가 있는 경우:11바이트 고정 초의 소수부분에 데이터가 없는 경우:7바이트 고정 |
TIMESTAMP WITH TIME ZONE |
고정 |
13바이트 |
TIMESTAMP WITH LOCAL TIME ZONE |
고정 |
11바이트 |
INTERVAL YEAR TO MONTH |
고정 |
5바이트 |
INTERVAL DAY TO SECOND |
고정 |
11바이트 |
RAW |
가변 |
실제로 저장되어 있는 데이터의 길이 |
LONG |
가변 |
실제로 저장되어 있는 데이터의 길이 |
LONG RAW |
가변 |
실제로 저장되어 있는 데이터의 길이 |
BLOB/CLOB/NCLOB |
지정에 따라 |
|
BFILE |
고정 |
530 바이트 |
ROWID |
고정 |
6 바이트(~Oracle7), 10바이트(Oracle8~) |
위의 수치를 토대로 예측단계로 넘어가보자. 일반적으로 varchar 타입의 경우에는 약 70% 정도의 값이 들어간다고 가정한다.
SQL> desc emp
컬럼명 NULL유무 데이터타입
----------------------------------------- -------- ------------------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
평균 레코드길이를 구하자
표3:각 컬럼 길이의 예제 | ||||
컬럼명 |
데이터 형 |
컬럼 데이터의 길이 |
컬럼 헤더의 길이 |
합계 길이 |
EMPNO |
NUMBER(4) |
1 + CEIL (4 / 2) = 3 바이트 |
1 바이트 |
4 바이트 |
ENAME |
VARCHAR2(10) |
CEIL (10 * 0.7) = 7 바이트 |
1 바이트 |
8 바이트 |
JOB |
VARCHAR2(9) |
CEIL (9 * 0.7) = 7 바이트 |
1 바이트 |
8 바이트 |
MGR |
NUMBER(4) |
1 + CEIL (4 / 2) = 3 바이트 |
1 바이트 |
4 바이트 |
HIREDATE |
DATE |
7 바이트 |
1 바이트 |
8 바이트 |
SAL |
NUMBER(7,2) |
1 + CEIL (7 / 2) = 5 바이트 |
1 바이트 |
6 바이트 |
COMM |
NUMBER(7,2) |
1 + CEIL (7 / 2) = 5 바이트 |
1 바이트 |
6 바이트 |
DEPTNO |
NUMBER(2) |
1 + CEIL (2 / 2) = 3 바이트 |
1 바이트 |
3 바이트 |
중간 합계 레코드 길이 |
47 바이트 | |||
레코드 길이(컬럼 헤더 3바이트를 가산) |
50 바이트 |
[출처] 로우의 사이즈를 추정해보자. |작성자 오라킬