Apache Doris 테이블 설계 가이드
Apache Doris에서 테이블 설계는 쓰기 성능, 쿼리 효율, 스토리지 비용을 직접 결정합니다. 이 장은 대표적인 설계 시나리오를 중심으로 구성되어 있으며, 테이블을 처음부터 설계하거나 기존 테이블의 구조를 최적화하는 데 도움을 줍니다.
설계 절차
Doris 테이블 설계는 일반적으로 다음 단계로 진행합니다.
- 테이블 모델 선택: 데이터를 저장하고, 중복을 제거하고, 집계하는 방식을 결정합니다.
- 컬럼과 데이터 타입 정의: 비즈니스 필드에 적합한 타입을 선택합니다.
- 파티셔닝과 버케팅 계획: 데이터를 고르게 분산하고 프루닝을 활용할 수 있도록 합니다.
- 인덱스 추가: 포인트 쿼리, 범위 스캔, 전문 검색의 속도를 높입니다.
- 스토리지 최적화: 압축, 행·열 하이브리드 스토리지, 핫/콜드 계층화를 통해 비용을 줄입니다.
- 스키마 변경: 비즈니스 변화에 따라 스키마를 조정하거나 자동 증가 컬럼을 사용합니다.
테이블 생성
Doris에서 테이블을 생성하려면 CREATE TABLE 문을 사용합니다. 기존 테이블을 바탕으로 새 테이블을 만들려면 다음을 사용할 수 있습니다.
- CREATE TABLE ... LIKE: 기존 테이블의 구조를 재사용합니다.
- CREATE TABLE ... AS SELECT (CTAS): 쿼리 결과를 기반으로 테이블을 생성합니다.
테이블 이름 규칙
Doris의 테이블 이름은 기본적으로 대소문자를 구분하며, 최대 길이는 64바이트입니다. 다음 설정으로 이 동작을 조정할 수 있습니다.
| 설정 | 기본값 | 설명 |
|---|---|---|
| lower_case_table_names | 대소문자 구분 | 클러스터를 처음 초기화할 때만 설정할 수 있으며, 이후에는 변경할 수 없음 |
| table_name_length_limit | 64바이트 | 너무 큰 값으로 설정하는 것은 권장하지 않음 |
주요 테이블 속성
테이블을 생성할 때 PROPERTIES에 일반적으로 사용하는 속성을 지정할 수 있습니다. 자세한 내용은 CREATE TABLE을 참조하세요.
| 속성 | 용도 |
|---|---|
buckets | 테이블 내 데이터 분산의 세분화 수준을 결정 |
storage_medium | HDD, SSD, 원격 공유 스토리지 등의 저장 매체를 제어 |
replication_num | 중복성과 신뢰성을 확보하기 위한 데이터 복제본 수를 제어 |
storage_policy | 핫/콜드 데이터 계층화에 사용할 마이그레이션 정책을 설정 |
테이블 속성은 파티션 수준에서 적용됩니다. 테이블 속성을 수정하면 이후에 생성되는 파티션에만 적용되며, 기존 파티션에는 영향을 주지 않습니다. 자세한 내용은 ALTER TABLE PROPERTY와 ALTER TABLE DISTRIBUTION을 참조하세요. 동적 파티셔닝에서는 이러한 속성을 별도로 설정할 수 있습니다.
테이블 모델 선택
테이블 모델 개요
Duplicate, Aggregate, Unique 모델을 비교하고 사용 시나리오에 적합한 데이터 저장 및 중복 제거 방식을 선택합니다
Duplicate 모델
원시 상세 데이터를 보존하며, 로그와 이벤트 등 중복 제거나 집계가 필요 없는 시나리오에 적합합니다
Unique 모델
기본 키를 기준으로 중복을 제거하고 높은 동시성의 실시간 업데이트를 지원하며, CDC와 주문 등 기본 키를 기준으로 데이터를 업데이트하는 시나리오에 적합합니다
Aggregate 모델
차원별로 데이터를 사전 집계하여 보고서 및 다차원 분석 쿼리의 성능을 높입니다
모델 선택 팁
대표적인 비즈니스 시나리오에 따른 테이블 모델 및 Key 컬럼 설계 권장 사항을 확인합니다
컬럼과 데이터 타입 정의
파티셔닝과 버케팅 계획
데이터 분산 개념
파티셔닝과 버케팅이 데이터를 tablet에 매핑하는 방식을 이해하고 여러 노드의 스토리지 및 컴퓨팅 성능을 충분히 활용합니다
기본 개념
파티션, 버킷, tablet, 복제본 등 데이터 분산과 관련된 기본 용어를 알아봅니다
수동 파티셔닝
테이블 생성 시 파티션 범위를 명시적으로 정의하며, 파티션이 고정되어 있고 세밀한 제어가 필요한 시나리오에 적합합니다
동적 파티셔닝
시간 차원에 따라 파티션을 자동으로 생성하고 정리하여 시계열 테이블 운영을 간소화합니다
자동 파티셔닝
유입되는 데이터를 기반으로 파티션을 자동 생성하므로 파티션 범위를 미리 정의할 필요가 없습니다
데이터 버케팅
파티션 내에 데이터가 고르게 분산되도록 적절한 버케팅 컬럼과 버킷 수를 선택합니다
일반적인 문제
파티셔닝 및 버케팅 설계에서 흔히 발생하는 실수와 문제 해결 방법을 알아봅니다
쿼리 가속: 인덱스
인덱스 개요
Doris가 지원하는 다양한 인덱스 타입과 각 타입에 적합한 쿼리 시나리오를 비교합니다
접두사 인덱스
정렬 키를 기반으로 하는 내장 인덱스로, 동등 조건 및 범위 쿼리의 속도를 높입니다
BloomFilter 인덱스
카디널리티가 높은 컬럼의 동등 조건 쿼리를 가속하고 불필요한 데이터 스캔을 줄입니다
NGram BloomFilter 인덱스
완전한 역색인을 도입하지 않고 LIKE 퍼지 매칭 쿼리의 속도를 높입니다
역색인(전문 검색)
토큰화된 전문 검색과 키워드 및 구문 매칭을 지원하며, 로그 및 텍스트 분석에 적합합니다
벡터 인덱스
HNSW, IVF 등의 알고리즘을 기반으로 고차원 벡터의 유사도 검색 속도를 높입니다
스토리지 최적화
스토리지 형식
Doris 컬럼형 스토리지 형식 V3의 설계와 장점을 알아봅니다
데이터 압축
적절한 압축 알고리즘을 선택하여 스토리지 비용과 쿼리 성능의 균형을 맞춥니다
행·열 하이브리드 스토리지
컬럼 스토리지에 행 스토리지를 추가하여 컬럼 수가 많은 테이블의 포인트 쿼리 속도를 높입니다
핫/콜드 데이터 계층화
콜드 데이터를 SSD/HDD 또는 S3, HDFS 등의 원격 스토리지로 내려보내 스토리지 비용을 줄입니다
스키마 변경
스키마 변경
ALTER TABLE로 컬럼과 타입을 추가, 삭제, 수정하고 경량 변경과 중량 변경의 차이를 알아봅니다
자동 증가 컬럼
자동 증가 컬럼을 사용하여 고유한 숫자 ID를 자동으로 생성하고 데이터 쓰기를 간소화합니다
특수 테이블과 모범 사례
설계 시 고려 사항
| 설계 항목 | 설명 | 영향 |
|---|---|---|
| 데이터 모델 | 테이블 생성 후에는 변경할 수 없으므로, 적합한 데이터 모델을 미리 선택해야 함 | 이후의 쓰기 및 쿼리 패턴을 결정 |
| 버킷 수 | 이미 생성된 파티션의 버킷 수는 변경할 수 없지만, 파티션 교체를 통해 조정할 수 있음. 동적 파티셔닝에서 이후에 생성될 파티션의 버킷 수는 변경할 수 있음 | 데이터 균형과 쿼리 병렬성에 영향 |
| 컬럼 변경 | VALUE 컬럼 추가 및 삭제는 경량 작업으로 수초 내에 완료되며, KEY 컬럼 추가 및 삭제나 데이터 타입 수정은 중량 작업임 | 대규모 데이터셋에서는 가능한 한 KEY 컬럼 변경을 피해야 함 |
| 스토리지 정책 | 핫/콜드 계층화를 사용하여 콜드 데이터를 HDD, S3 또는 HDFS로 마이그레이션 | 스토리지 비용을 크게 절감 |