1) CHAR vs VARCHAR 2) VARCHAR vs TEXT
Char vs VarChar
모델링
논리 모델링 (업무 전문가)
- 업무 분석
- 엔티티 , 속성, 관계 도출
- 정규화
물리 모델링 (dbms 전문가)
- dbms 벤더별 최적 컬럼 타입 선정
- 접근 패턴 분석
- 반 정규화
- 인덱스 전략 수립
Char vs VarChar
공통점
- 문자열 저장용 컬럼
- 최대 저장 가능 문자 길이 명시 (바이트 수를 의미하는 것이 아님) , CHAR(10), VARCHAR(10)둘다 10글자까지 만 저장가능하다는 의미이다.
차이점
- 값의 실제 크기에 관계 없이 고정된 공간 할당 여부
- 최대 저장 길이 = CHAR(255) vs VARCHAR(16383) == 65535 바이트
- 저장된 값의 길이 관리 여부 (VARCHAR 와 , 가변길이 문자셋 사용하는 CHAR는 저장된 값 길이 관리)
- 0~255bytes => length-bytes: 1
- 256 ~ 65535 bytes => length-bytes: 2
- 저장된 길이에 따라 length를 표현하는 bytes수가 다름을 의미한다.
실제로 길이 저장용 1byte는 컬럼 바로앞에 있는거 같지만 , 실제로는 그렇지 않고 좀 더 복잡한 형태로 저장된다.
가변결이 character set인 UTF8MB4 같은 경우 CHAR에서 예약공간이 안 생길수도 있다.
정해진 10보다 더 많은 바이트가 사용되어지는 경우
위 한글자는 3byte이다.
CHAR 타입의 공간 낭비
일반적으로 알고 있는 구분 기준
- 고정된 길이의 값 저장은 CHAR 타입, 그 외의 경우 VARCHAR 타입
CHAR 대신 VARCHAR를 사용하면?
- 어떤 경우에는 CHAR 타입의 공간 낭비가 심함
- 저장되는 문자열의 최소 최대 길이 가변 폭이 큰 경우 ( 1 ~ 100 )
- 공백으로 저장되어 낭비되는 공간이 늘어난다.
- 하지만 그렇지 않은 경우도 있음
- 저장되는 문자열의 초소 최대 길이 가변 폭이 작은 경우
- 저장되는 값의 길이 변동이 크지 않다면 낭비는 크지 않음
VARCHAR을 사용할때 길이 가변적으로 변한경우에 기존 저장된 공간을 사용하지 못함으로 새로운 RECORD 주소를 찾아서 나간후에 옮겨쓰기를 진행한다.
이러한 일이 계속 반복된다면 나중에는 저장 할 공간이 없어서 RECROD COMPACTION이 일어난후에 자리가 마련될 수도 있다.
CHAR의 경우에는 미리 예약된 공간이 더 넓기 때문에 위의 경우에서 새로운 공간찾기 및 옮겨쓰기가 생략될 것이다.
VARCHAR 보다는 CHAR 선택해야 하는 경우
- 값의 가변길이 범위 폭이 좁고
- 자주 변경되는 경우 (특히 인덱스된 컬럼인 경우)
이런경우 VARCHAR 사용시
- 데이터 페이지 내부의 조각화 현상이 자주 일어난다.
- CHAR 타입보다 공간 효율 떨어짐
- 내부적으로 빈번한 PAGE REORGANIZE 작업 필요
VARCHAR vs TEXT
공통점
- 문자열 속성 값을 저장
- 최대 65,535 bytes 까지 저장 가능
차이점
- VARCHAR 타입 컬럼에는 지정된 글자 수 만큼만 데이터 저장 가능
- VARCHAR(10) -> 10글자 이하만 저장 가능
- TEXT 타입 컬럼은 인덱스 생성 시 반드시 PREFIX 길이 지정이 필요하다.
- CREATE INEDX ix_text_column ON table (text_column(100));
- TEXT 타입 컬럼은 표현식으로만 디폴트 값 지정 가능
- CREATE TABLE tb1 (col TEXT DEFAULT 'abc') -> 에러 발생 (VARCHAR는 가능)
- CREATE TABLE TB1 (col1 TEXT DEFAULT ('abc')) -> 생성 가능 (TEXT는 이렇게 써야함)
일반적인 사용 형태
- 길이가 짧으면 VARCHAR 타입, 길이가 길면 TEXT 타입 (명확한 길이 기준이 없다)
그렇다면 VARCHAR(5000) vs TEXT?
- VARCHAR 타입은 메모리 버퍼 공간을 미리 할당해두며 재활용 가능, TEXT 타입은 그때 그때 필요할 때마다 할당 ,해제
- 컬럼 사용이 빈번하고 메모리 사용량이 충분하다면 VARCHAR 타입 추천
- VARCHAR(5000) 과 같이 길이가 긴 컬럼들을 자주 추가하는 경우, ROW 사이즈 제한 (65535 BYTES)에 도달 할 수 있으므로 적절하게 TEXT 타입과 같이 사용하는 것을 권장
VARCHAR(30) vs VARCHAR(255) ?
- 실제 최대 사용하는 길이만큼 명시해야 메모리 사용 효율 증가
- 디스크 공간 효율 차이도 미미하게 존재 (1bytes, 2bytes)
성능뿐만아니라 db 자원까지 낭비되게 된다.
정리
상대적으로 저장되는 데이터 사이즈가 많이 크지 않고, 컬럼 사용이 빈번하며 DB 서버의 메모리 용량이 충분하다면 VARCHAR 타입 권장
저장되는 데이터 사이즈가 큰 편이고, 컬럼을 자주 사용하지 않으며 테이블에서 다른 문자열 컬럼들이 많이 사용되고 있는 경우 TEXT 타입 권장
VARCHAR 타입을 사용하는 경우 , 길이는 실제 사용되는 만큼만 지정
쿼리의 SELECT 절에는 가능하면 필요한 컬럼들만 명시하는 것이 좋다.
- 그렇지 않은 경우, 테이블에 대형 데이터 저장 컬럼 존재시 쿼리 처리 성능이 감소한다.
- 필요한 컬럼만 명시하면 커버링 인덱스 방식으로 처리될 가능성이 높아진다.