Sangwon
06/12/2026, 2:05 AMRocky
06/12/2026, 2:05 AMsql
SET enable_profile = true;
-- 쿼리 실행 후
SHOW PROFILELIST;
ANALYZE PROFILE FROM 'query_id';
2. 데이터 분포 최적화 (Partitioning & Bucketing)
데이터가 적절히 분산되어 있지 않으면 특정 노드에 부하가 쏠리거나 불필요한 데이터를 너무 많이 스캔하게 됩니다.
* Partitioning (파티셔닝): 주로 날짜(DATE, DATETIME) 컬럼을 기준으로 `PARTITION BY RANGE`를 사용합니다. 쿼리 조건에 파티션 컬럼을 포함하면 불필요한 파티션을 읽지 않아(Partition Pruning) 성능이 급격히 향상됩니다.
* Bucketing (버케팅): DISTRIBUTED BY HASH(column) 설정 시, 고카디날리티(중복도가 낮은) 컬럼(예: ID, 사용자 번호)을 선택하세요.
* 버킷당 데이터 크기는 약 1GB ~ 10GB 내외가 적당합니다.
* 자주 조인하거나 필터링하는 컬럼을 버케팅 키로 쓰면 성능에 유리합니다.
3. 정렬 키(Sort Key) 설정
StarRocks는 테이블 생성 시 지정한 *Key 컬럼들*을 기준으로 데이터를 정렬해 저장합니다.
* DUPLICATE KEY, PRIMARY KEY 등에 지정된 컬럼 순서대로 데이터가 정렬됩니다.
* *자주 필터링(WHERE 절)에 사용하는 컬럼*을 앞 순서에 배치하세요. 이를 통해 Prefix Index와 Zone Map(Min/Max 필터링)을 효과적으로 활용할 수 있습니다.
4. 인덱스 활용
정렬 키만으로 부족할 경우 추가 인덱스를 생성합니다.
* Bitmap Index: 카디날리티가 낮은(중복이 많은, 예: 성별, 상태값) 컬럼의 등호(=) 연산에 효과적입니다.
* Bloom Filter Index: 카디날리티가 높은 컬럼의 등호(=)나 IN 연산에 효과적입니다.
5. 통계 정보 최적화
옵티마이저가 최적의 실행 계획을 세우려면 최신 통계 정보가 필요합니다.
sql
ANALYZE TABLE <table_name>; -- 수동 통계 수집
6. 구체화된 뷰 (Materialized View)
쿼리 패턴이 특정 집계(SUM, COUNT 등)나 조인을 반복한다면, *Materialized View*를 생성하여 미리 계산해 두는 것이 좋습니다. StarRocks의 MV는 쿼리 재작성(Query Rewrite)을 통해 사용자가 직접 MV를 조회하지 않아도 원본 테이블 조회 시 자동으로 최적화된 MV를 참조합니다.
7. 데이터 타입 최적화
* 가능한 한 가장 작은 데이터 타입을 사용하세요. (예: BIGINT 대신 INT, STRING 대신 VARCHAR 등)
* STRING 타입보다는 길이가 고정된 `CHAR`나 제한된 `VARCHAR`가 성능상 유리할 수 있습니다.
요약하자면: 먼저 `ANALYZE PROFILE`로 스캔량이 많은지, 조인 비용이 큰지 확인하신 후, *파티션/버킷 설계*와 *정렬 키 순서*를 다시 점검해 보시는 것을 권장합니다. 추가로 구체적인 테이블 스키마와 쿼리를 공유해 주시면 더 정확한 가이드를 드릴 수 있습니다.
References
• best_practices/bucketing.md
• best_practices/table_clustering.md
• table_design/data_distribution/Data_distribution.md