[펌글] Char와 VarChar2 Type의 비교분석

By | 2월 2, 2009

- 출처 : http://blog.paran.com/oraclejava/9878921 -

A. CHAR

- 고정 길이 문자열을 저장한다. 사용자가 고정길이 보다 짧은 값을 저장하면 나머지 공
간은 Space로 체원진다.
- 1~255까지의 문자를 저장.
- 사용자가 후행 공백을 포함하여 고정길이 보다 큰 값을 입력하면 고정 길이에 맞게 값에서
공백이 잘린다.
- 값이 너무크면 Oracle Error발생
- 공백채움비교(blank-padded comparison semantics)를 사용한다.[비교문자열 둘다가
CHAR인경우]
a. 비교하는 두변수의 값이 길이가 다른 경우 짧은쪽을 공백으로 채운다는 것을 의미함

예) ‘a ‘ = ‘a’(우측의 갑은 1 Byte이므로 1 Byte를 공백으로 채워 2 Byte를 만든후 비교한다.)

- 데이타의 컬럼 길이가 짧고 거의 모든 데이타의 길이가 일정량을 넘어 확정된 크기에 대한 사용
비율이 높은 고정 길이인 경우 사용된다. 예를 들면 사번, 각 바이트가 의미가 있는 코드 등에
사용된다.

- 가변 길이로 지정할 경우 사이즈 증가로 인한 많은 체인 발생이 우려되는 경우
- 초기에는 데이타가 입력 되어 있지 않지만 일정 시간이 지나면 데이타가 입력 되어 지는 경우
- 오라클에서 권장하기는 CHAR보다는 VARCHAR2을 사용하는 것이 효과적임

B. VARCHAR2

- 가변길이 문자열을 저장한다. 1 ~2000 Byte 저장가능함.
- 최대 50자를 저장할수 있는 VARCHAR2 TYpe의변수에 10자를 저장한다면 실제 저장공간에 10자만을
저장한다.
- 공백채우지 않음 비교(non-padded comparison semantics)를 사용한다.[비교값 둘다 또는 한쪽
이라도 VARCHAR2 Type인 경우]

예)’a ‘ > ‘a’(우측의 값이 길이가 짧아도 공백으로 채우지 않으니까 왼쪽의 값이 큰 것은 당근)

- 처음 테이블 생성시 해당 블럭에 데이타 증분치를 고려하여 PCTFREE(디폴트 10)라는 파라메터를
지정하게 되는데 데이타 증분이 많이 발생하게 되면 이영역이 모두 소모 되어 체인이 발생하여
원하는 로우를 검색하고자 할때 필요없는 I/O를 발생 시킨다. 하지만 대개 테이블을 생성하게 되는
개발자는 테이블의 증분 가능성및 수치에 대해 예상하여 적절한 PCTFREE 값을 사전에 적절이
지정할 수 있을 뿐만 아니라, USER_TABLES라는 딕션널리 정보를 검색하여 발생한 체인 발생정도를
파악할 수 있다. 만일 심하게 체인이 발생할 경우 EXP/IMP 유틸리티를 이용하여 체인을 제거할
수 있으며 설령 약간의 체인이 존재할 경우라도 해당 테이블을 사용하는데 많은 제약이 되지 않는다.
또한 VARCHAR2 타입을 사용할때 DEFAULT라는 사용자 제약 조건에 의해 사전에 공간을 확보할 수 있다
- VARCHAR2 타입을 사용한다 할지라고 예견 못할 체인 발생에 대해 전혀 문제점이 없다는 것을
알수 있고, VARCHAR2 타입을 사용함으로서 보다 효과적으로 저장 공간을 이용할 수 있으며 이는
긍국적으로 수행 속도의 향상을 의미하게 된다.

------------------------------
적절한 문자 Data Type 선택방법
------------------------------
1. 비교의미 에서 ANSI 호환성이 필요한 경우 , 즉 후행공백이 중요하지 않으면 CHAR유형을
사용하고 중요하다면 VARCHAR2 Type을 사용한다.
2. 저장공간의 효율적 사용을 위해서는 VARCHAR2 Type을 사용한다.(char type 은 고정길이)
3.전체 테이블을 스캔할 경우 CHAR 형태로 저장된 테이블이 VARCHAR2 형태로 저장된 데이타 보다
많은 블럭 입출력을 발생시켜 속도가 느려질 수 있다. 반면 VARCHAR2 형태의 데이타가 증가 될때는
블럭 내 PCTFREE 영역을 사용하게 되고 만일 이 영역이 모자라는 경우 블럭 체인이 발생하여
원하는 데이타를 검색하고자 할 때 하나 이상의 블럭을 검색하게 되어 오히려 수행 속도에 악영향을
미칠 수 있다.

4.VARCHAR2 타입은 가능한 충분히 최대치를 부여하는 것이 효과적이다. 왜냐하면 실지 크기만
저장되지 컬럼 선언시 지정한 사이즈가 실지로 내부 블럭에 저장되지 않는다 따라서 되도록 큰
사이즈를 지정함으로서 길이 부족으로 인한 에러는 방지 할 수 있다. 흔히 현업에서 성명 타입의
사이즈를 결정할때 8 바이트 10바이트 12 바이트등 여러가지 논란이 있어 왔으나 오라클을
사용하는 경우 VARCHAR2 타입으로 넉넉히 확정하더라도 공간이용 측면에서 전혀 불이익이 없이
가변적인 성명(외국인 성명 포함) 길이를 수용할 수 있다.

5.CHAR 타입은 한 바이트라도 값이 들어간다면 지정된 크기 만큼 내부적으로 크기가 확정됨므로
가능한한 최소 길이로 확정하는 것이 효과적이다. 충분히 해당 크기를 예상할 수 있는 컬럼, 즉 사
번, 코드 등등 확정된 컬럼에만 지정하는 것이 효과적이다. 만일 매우 가변적인(컬럼내에 입력되는
데이타의 길이 편차가 클때) 경우 필요없는 공간 낭비를 가져올 수 있다는 사실을 명심해야 한다.

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments