Sangwon
06/17/2026, 1:55 AMRocky
06/17/2026, 1:55 AMDATETIME 같은 시간 컬럼을 기준으로 RANGE 파티션을 사용합니다.
* 이점: `WHERE date >= '2023-01-01'`와 같은 범위 조건 시, 해당하지 않는 파티션 전체를 스캔 대상에서 제외(Partition Pruning)하여 성능을 획기적으로 높입니다.
* 팁: StarRocks 3.1 이상이라면 PARTITION BY (column) 문법을 통한 자동 파티션(Auto Partitioning) 기능을 사용하여 관리를 자동화하는 것이 좋습니다.
2. 버켓팅(Bucketing): 등호(=) 조건 최적화
버켓팅은 파티션 내부의 데이터를 해시 함수를 통해 여러 개의 버켓(Tablet)으로 쪼개는 두 번째 단계입니다.
* 설계 원칙: `DISTRIBUTED BY HASH(column_name)`에 *등호(=) 조건으로 자주 필터링되는 고카디널리티(Unique한 값이 많은) 컬럼*을 지정하세요. (예: user_id, order_id)
* 이점: WHERE user_id = 123 쿼리 시, 해시 값을 계산해 해당 데이터가 들어있는 특정 버켓만 바로 찾아가므로(Bucket Pruning), 전체 파티션을 뒤질 필요가 없습니다.
* 버켓 수 산정: 압축 후 데이터 기준으로 버켓당 100MB ~ 1GB 정도가 유지되도록 설정하는 것이 이상적입니다.
3. 정렬 키(Sort Key): 버켓 내부 스캔 최적화
테이블 생성 시 `DUPLICATE/PRIMARY/AGGREGATE KEY`에 나열된 컬럼 순서가 실제 스토리지의 정렬 순서를 결정합니다.
* 설계 원칙:
1. *가장 자주 쓰이는 등호(=) 조건 컬럼*을 가장 앞에 둡니다.
2. 그 뒤에 *범위 조회(Range)를 자주 하는 컬럼*을 둡니다.
* 이점: StarRocks는 설정된 키의 앞부분(Short Key Index)을 인덱스로 관리하므로, 버켓 안에서도 데이터 위치를 빠르게 찾을 수 있습니다.
──────────
실전 예시 (DDL 설계)
사용자가 `event_time`으로 범위를 조회하고, `user_id`로 특정 사용자를 찾는 경우가 많을 때의 설계 예시입니다.
sql
CREATE TABLE events (
event_time DATETIME NOT NULL,
user_id INT NOT NULL,
event_type VARCHAR(20),
payload JSON
)
DUPLICATE KEY(user_id, event_time) -- [중요] 1. user_id(= 조건), 2. event_time(Range 조건) 순서
PARTITION BY RANGE(event_time) ( -- [중요] 범위 조회를 위한 파티셔닝
START ("2024-01-01") END ("2025-01-01") EVERY (INTERVAL 1 DAY)
)
DISTRIBUTED BY HASH(user_id) BUCKETS 16; -- [중요] 특정 유저 조회를 위한 버켓팅
요약 가이드
1. 범위 조건(>,<,BETWEEN): PARTITION BY RANGE 컬럼으로 설정.
2. 등호 조건(=): DISTRIBUTED BY HASH 컬럼으로 설정.
3. 복합 최적화: KEY(...) 설정 시, 등호 조건 컬럼을 앞쪽에, 범위 조건 컬럼을 뒤쪽에 배치하여 인덱스 효율 극대화.
이 구조를 따르면 대규모 데이터에서도 특정 조건의 데이터를 단 몇 개의 태블릿 스캔만으로 빠르게 읽어올 수 있습니다.
References
• table_design/data_distribution/Data_distribution.md
• table_design/StarRocks_table_design.md
• best_practices/query_tuning/schema_tuning.md
• best_practices/bucketing.mdSangwon
06/17/2026, 1:56 AMRocky
06/17/2026, 1:56 AM