본문 바로가기
DB/ORACLE

DB 엔진 - 도메인 char, varchar2

by jun.s.gi 2022. 12. 28.
728x90

테이블을 만들면서 칼럼의 도메인을 char 또는 varchar2로 설정한 적이 있을 것이다.

개인이 sql을 공부한하던가, 저장공간 대비 DB 사용공간이 적다면 두 도메인을 사용하는 데 신경 쓰지 않아도 되지만,

물리적인 디스크 내부의 공간을 효율적으로 사용해야 한다면 두 도메인 선택에 신중해야 한다.

 

CHAR
create table test(
test1 char(10)
)
/

insert into test
values('t1')

char도메인을 사용하는 칼럼은 insert시 사용자가 정한 크기만큼 고정적인 공간을 할당한다.

 

위 코드 test테이블의 test1 칼럼의 't1'은 2byte 밖에 공간을 사용하지 않지만 물리적인 디스크 공간에 10byte만큼 고정적으로 사용할 수 있기 때문에 할당된 크기 내에서 자유롭게 수정할 수 있다.

즉 변화가 많은 데이터라면 char도메인으로 설정해주는 것이 공간을 효율적으로 사용할 수 있을 것이다.

※ 크기를 고정적으로 할당하기 때문에 위와 같이 할당해준 공간은 크지만 삽입된 데이터는 적은 공간을 차지하고 오랜 기간 변화가 없다면 공간낭비가 발생할 수도 있다.

 


varchar2
create table test2(
test2 varchar(10)
)
/

insert into test2
values('t2')

varchar2 도메인을 사용하는 칼럼은 insert시 물리적인 내부 공간(디스크)에 가변적인 공간을 할당한다.

 

위 코드 't2'데이터는 10byte라는 공간을 할당받았지만 2byte밖에 사용하지 않았다. varchar2 도메인은 삽입되고 남은 공간은 다음 칼럼을 위해 공간을 내어준다.

다음 공간을 내어주어도 t2는 10byte만큼 공간을 사용할 수 있는 권한이 있기 때문에 update시 더 많은 공간을 요구한다면  block의 여유공간에 chaining 한다.

 

block은 실제로 block header 공간 200byte(정도)와 여유공간 block의 10%를 남겨둔 나머지 공간에 데이터를 삽입한다.

 

※사용하고 남은 공간은 다음 삽입될 데이터가 사용할 수 있도록 공간을 내어주어 디스크 공간을 효율적으로 사용할 수 있지만, 만약 변화가 많은 데이터 수만 개가 varchar2로 저장된 상태라면 block 내부의 여유공간이 부족하여 다른 block 여유공간에 chaining 하다 보면 메모리로 한 번만 읽어오면 될 일을 여러 번 읽어와야 할 수도 있다.

 

row id는 그대로지만 실제 저장되는 곳이 다른 row migration도 마찬가지로 row id를 읽고 실제 저장된 위치 파악 후 접근하여 작업 두 번 이상 이루어짐

 

 

자주 변하지 않으면 char ( 공간 낭비 주의 )

자주 변하면 varchar2 ( 메모리로 올라가기까지 작업 횟수 증가 주의)

728x90

'DB > ORACLE' 카테고리의 다른 글

DB 엔진 - DB block header  (0) 2022.12.26
DB 엔진 - 병행성과 일관성, Lock  (0) 2022.12.26
DB 엔진 - 기동 순서, 복구, 백업  (0) 2022.12.23
DB 엔진 - Execution  (0) 2022.12.22
DB 엔진 - Parsing, hash value  (0) 2022.12.20