CHAR 와 VARCHAR
CHAR
고정길이 문자열 타입으로 만약 타입의 크기만큼의 데이터가 들어오지 않은경우 이후의 공간을 스페이스로 채워넣습니다.
고정길이 문자열이기 때문에 헤더에는 레코드의 길이에 대한 정보가 들어있지 않습니다.
VARCHAR
가변길이 문자열 타입으로 타입의 크기만큼의 데이터가 들어오지 않더라도 이후의 공간을 스페이스로 채워넣지 않습니다.
가변길이 문자열이기 때문에 헤더에는 레코드의 길이에 대한 정보가 포함되어야 합니다.
예를들어 CHAR(5) 와 VARCHAR(5) 에 데이터 ABC 가 들어오는 경우 아래처럼 저장이 됩니다.
CHAR 와 VARCHAR 의 차이점
그렇다면 실제 쿼리에서 조회를 하게 되면 어떻게 될까요?
GOLDILOCKS 데이터베이스에서 테스트를 진행해보았습니다. ORACLE, MYSQL 등도 동일합니다.
CHAR 와 VARCHAR 타입을 가진 테이블을 생성한 뒤 데이터를 넣습니다.
CREATE TABLE Z1 (C1 CHAR(5), C2 VARCHAR(5)); INSERT INTO Z1 VALUES ('ABC', 'ABC'); COMMIT;
C1 컬럼에 대해서 비교를 해봅니다. 조건절에 'ABC ' 를 하였음에도 불구하고 데이터가 조회되는 것을 확인할 수 있습니다.
gSQL> SELECT * FROM Z1 WHERE C1 = 'ABC'; C1 C2 ----- --- ABC ABC 1 row selected. gSQL> SELECT * FROM Z1 WHERE C1 = 'ABC '; C1 C2 ----- --- ABC ABC 1 row selected.
C2 컬럼에 대해서 비교를 해봅니다. 조건절에 'ABC ' 를 입력하면 데이터가 조회되지 않습니다.
gSQL> SELECT * FROM Z1 WHERE C2 = 'ABC'; C1 C2 ----- --- ABC ABC 1 row selected. gSQL> SELECT * FROM Z1 WHERE C2 = 'ABC '; no rows selected.
이유는 C1 컬럼에서 빈 공간은 SPACE 로 채워지는 반면 C2 컬럼에서는 말 그대로 ABC 만 저장하기 때문입니다.
gSQL> SELECT DUMP(C1), DUMP(C2) FROM Z1; DUMP(C1) DUMP(C2) ------------------------------------ --------------------------------- Type=CHAR Len=5 : Str=65,66,67,32,32 Type=VARCHAR Len=3 : Str=65,66,67 1 row selected.
CHAR 와 VARCHAR 어느것을 사용해야 할까?
속도
VARCHAR 는 CHAR 타입에 대비해서 레코드의 길이가 몇이다 라는 연산을 거쳐야 합니다.
당연히 속도상에서 아주아주 미세하게 이점이 있을 수 있습니다.
그러나 이 이점은 정말 지나칠 정도의 민감함이며, VARCHAR 를 사용하여 성능저하가 느껴진다 라고 느낄일은 없다고 생각됩니다.
공간
CHAR 는 고정길이 공간 입니다. 초기의 데이터에서 더 긴 경우의 데이터로 갱신되는 경우 이미 할당해 놓은 공간을 재사용합니다.
VARCHAR 는 가변길이 공간 입니다. 초기의 데이터에서 더 긴 경우의 데이터로 갱신되는 경우 해당 공간에 쓰지 못하고 데이터 마이그레이션 현상이 나타날 수 있습니다.
그러나 벤더사별로 REORG, REBUILD 라는 분할된 블럭등을 정리하는 기능이 나오고 있습니다. 이미 나온곳도 있습니다.
그래서 VARCHAR 의 블럭분할 현상도 갱신되었다고 봅니다.
프로젝트는 진행되면서 얼마든지 변할 수 있습니다.
오히려 고정공간을 만들어 놓았다가 빈 공간에 대한 비용이 더 큰 경우가 생길 수 있으므로 저는 VARCHAR 를 추천합니다.
'Database > DBA 의 개인생각' 카테고리의 다른 글
[DBA] 트리거가 성능에 미치는 악영향에 대해서 (0) | 2019.08.07 |
---|---|
[DBA] 게시판 페이징 처리하는 방법 (Scan VS Seek) (0) | 2019.05.02 |
[DBA] COUNT(*) 안쓰고 테이블 총 레코드 조회하는 법 생각해보기 (0) | 2019.02.12 |
[DBA] DBA 란, DBA 가 하는일 알아보기 (0) | 2018.11.25 |
[DBA] WHERE 1 = 1 은 써야할까 말아야할까 (3) | 2018.09.18 |