테이블을 만들면서 칼럼의 도메인을 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 ( 메모리로 올라가기까지 작업 횟수 증가 주의)
'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 |