안녕하세요. SQLER의 코난 김대우입니다.
이번 강좌에서는, 5-2. 테이블 생성과 데이터형 선택을 진행 하겠습니다.
SQLER에서 진행되는, 챗GPT와 함께 배우는 SQL Server 강좌 목록
이번에 진행할 강좌는 테이블을 생성할 때, 어떤 데이터형을 선택해야 하는가에 대한 논의입니다.
TL;DR
가능한 작은 데이터형을 선택하고, 데이터형에 따른 저장 공간 크기를 고려하세요. 작은 데이터형은 빠른 읽기/쓰기 속도를 제공하고, 메모리를 절약할 수 있습니다.
지난 2-4. 데이터형(Data type)과 함수(Function) 강좌에서 데이터형에 대해 소개해 드렸습니다. 지난 3-1. 데이터 삽입, 삭제, 수정 - INSERT를 이용한 행 삽입과 4-1. SQL Server 데이터베이스와 데이터베이스 개체의 이해 강좌에서는 IDENTITY와 SEQUENCE도 소개해 드렸어요.
그렇다면, 테이블을 생성할 때, 컬럼 데이터형을 어떤 기준으로 선택해야 할까요?
가능한 작은 데이터형을 사용
데이터형마다 사용하는 저장 공간의 크기가 다릅니다. 예를 들어, int형은 2억까지 지정 가능 합니다. 하나의 값 당 4 Byte입니다. 만약, 입력받을 값이 절대 3만을 넘을 일이 없다면 이걸 경우 smallint형으로 지정할 수 있습니다. smallint는 -2^15 (-32,768)부터 2^15 - 1 (32,767)까지 지정할 수 있기 때문입니다. 즉, 2 Byte로 사용할 수 있습니다.
만약, 컬럼의 입력 값이 255를 넘지 않는다면? tinyint 형을 사용할 수 있습니다. 1Byte만 사용합니다.
또는, 0 또는 1만 사용해 True 또는 False 플래그만 설정하면 될 경우는 int형이 아니라 bit 형을 사용해도 됩니다. 물론 향후 얼마나 커질지를 주의 깊게 고려하고 선택하세요.
아니 2023년, 디스크 가격이 1GB당 30원 정도인데, 그깟 1Byte니 2Byte니 따질 이유가 뭐 있나요? 그냥 bigint(8 Byte)로 때려 넣어도 되지 않나요?
일부는 맞는 말입니다. 하지만, 성능의 관점에서 볼 때는 분명 차이가 있습니다.
작은 데이터형, 빠른 속도
SQL Server가 데이터를 읽고 쓸 경우 작은 데이터형이 더 빠르게 읽고 쓸 수 있습니다.
디스크 비용과 메모리 비용
디스크는 저렴하지만, SQL Server의 캐시 공간은 저렴하지 않습니다. 작은 데이터 = 작은 메모리 공간 사용 = 작은 SQL Server 캐시가 사용되어 성능이 향상됩니다.
데이터뿐만 아니라, 부가 데이터도 관리
인덱스 생성/유지 시 통계 등에 더 빠르게 적용됩니다. SQL Server에 데이터만 존재하지 않습니다. 성능에 지대한 영향은 인덱스 설계에서 나오죠. 인덱스는 B-Tree(Balanced Tree)로 구성되며 테이블 데이터 통계 정보를 이용합니다. B-Tree를 작게 유지 = 빠른 성능, 작은 통계 데이터 = 인덱스 빌드/쿼리 최적화기의 빠른 처리 등의 장점이 있습니다.
어쩌면, 대용량 데이터를 다루기 전까지는 크게 와닿지 않을 수 있습니다. 하지만, 항상 최대 데이터 입력값을 고려하고, 데이터형은 작을수록 유리하다는 것을 염두에 두시실 바랍니다.
☑️ 챗GPT 활용: Balanced Tree 구조에 대해서 알려줘
CHAR와 VARCHAR - 고정길이 또는 가변길이 문자열형 선택
CHAR는 고정길이입니다. 예를 들어, CHAR(10)으로 지정하고 “Hello”를 저장하면 5글자가 저장되고 뒤의 5글자는 공백이 채워져 “Hello ” 문자열로 저장됩니다. VARCHAR는 가변길이입니다. 저장하면 딱 5글자만 저장됩니다.
귀찮게 고정길이 쓸 필요 있나요? 뒷 공백 지우려면 매번 RTRIM() 해야 하고, 그냥 가변길이 다 쓰면 되지 않나요?
생각보다 다양하게 고정길이 데이터가 사용됩니다. 우편번호나 전화번호 같은 데이터입니다. 이런 경우에는 생각보다 고정길이가 유용합니다. 고정길이는 사용될 저장소의 크기를 쉽게 예측할 수 있습니다. INT형 하나, CHAR(10) 하나에 100만 건이 들어간다면 쉽게 테이블 크기를 예측할 수 있죠. 성능 측면에서도 고정길이 컬럼이 약간 뛰어납니다. 특히, 조회에서는 약간 앞서지만 대량 데이터를 삽입, 수정할 경우 충분히 체감되는 성능 차이가 있습니다.
일반적인 경우라면 가변길이를 사용하세요. 대량 데이터 삽입, 수정이 자주 있다면 고정길이를 사용을 고려하세요.
VARCHAR(MAX)가 아니라 VARCHAR(N) 사용
(참고: SQL Server의 text, ntext, image 형은 차기 버전에서 제거될 예정이니 가능한 사용하지 마세요.)
문자열을 저장할 때 VARCHAR(MAX) 선언이 가능하고 가변길이라면서요?
그럼 모든 문자열 컬럼을 VARCHAR(MAX)로 하면 되지 않나요?
VARCHAR(MAX)는 최대 2G까지 문자열을 저장할 수 있고, 기존 text형을 대체합니다. 여러 장점이 있지만, 모든 문자열 컬럼에 사용은 하지 마세요.
- VARCHAR(MAX)는 색인 컬럼으로 사용 불가합니다.
- VARCHAR(MAX) 중 8,000 Byte 이상은 LOB_DATA 저장소 페이지에 저장됩니다.
간략히, 로우 정보가 저장되는 페이지가 아니라, 외부 페이지에 데이터를 저장하고, 데이터 입출력이 느려집니다.
☑️ 챗GPT 활용: SQL Server LOB_DATA 저장소 페이지에 대해서 알려줘
즉, 모든 컬럼에 적용하는 것은 전혀 권장하지 않습니다. 8,000 Byte 이상의 문자열 입력이 예상될 경우에만 VARCHAR(MAX)를 적용하세요.
유니코드 문자열 데이터형
지난 강좌에서 몇 번 소개해 드렸습니다. 2-2. 데이터 검색 - SELECT 구문 강좌와 2-7. ORDER BY 결과 정렬 강좌입니다.
문자열 앞에 N이 붙어있다면 유니코드 설정입니다. 예를 들어, 컬럼에 NCHAR 또는 NVARCHAR 데이터형을 사용하고, 데이터형 앞 또는 문자열 앞에 “N”을 붙일 경우 이 N의 의미는 유니코드를 의미합니다.
유니코드
간략히, 유니코드(Unicode)는 전 세계 언어를 지원하기 위해 설계된 문자코드입니다. SQL Server를 포함한 거의 모든 데이터베이스는 일반적으로 하나의 언어를 지원하는 설정으로 데이터베이스가 사용됩니다. 이럴 경우, 다른 언어 데이터를 이 데이터베이스에 저장하려면 데이터 관리가 어려워지죠.
SQL Server와 같은 데이터베이스는 다양한 애플리케이션 및 클라이언트에서 다국어 데이터가 입력될 수 있으므로 항상 명시적으로 데이터 형식을 선언하는 것이 좋습니다. 유니코드 데이터는 다양한 문자를 저장하고 처리 가능해 데이터의 정확성을 유지할 수 있습니다.
유니코드 데이터 형식을 사용하면 데이터베이스에서 다국어 데이터를 저장하고 검색할 수 있으며, 다양한 언어로 작성된 애플리케이션과의 상호 운용성을 확보할 수 있습니다.
정리하자면, SQL Server를 사용할 때는 데이터베이스 설정에서 유니코드 지원을 활성화하고, 가급적이면 유니코드 데이터 형식을 사용하여 다국어 데이터를 처리해야 합니다.
다국어 데이터를 저장할 경우 유니코드 문자열형을 사용하세요. 주의해야 할 사항으로 영어를 포함한 모든 언어 1 글자당 2 Byte이기 때문에 NVARCHAR(8000)으로 컬럼을 선언해도 최대 4,000 글자만(정확히는 글자가 아니라 “바이트 쌍(byte-pairs)”) 입력할 수 있습니다.
이렇게 간략히, 테이블 생성 시 데이터형 선택 강좌를 진행했습니다. 다음 강좌에서는 실제 테이블을 생성하겠습니다.
SQL 강좌 책 구매
강좌가 도움이 되셨다면, 책으로 구매 가능합니다. 책 판매 수익금은 전액 코딩 교육 사회공헌 활동에 기부되며, 아래 링크에서 구매하시면 더 많은 금액이 기부됩니다.
Comment 1
-
이리
2023.10.25 08:37
int 형이 21억인데 2억으로 오타인 것 같습니다.