<@U0A71G31CDV> Starrocks internal catalog에서 테이블 만들...
# questions-and-troubleshooting
s
@Rocky Starrocks internal catalog에서 테이블 만들때, 파티션이랑 버킷팅 정책을 좀 상세하게 가고싶어 =조건이랑 범위 조회 조건에 유리한 설계의 가이드를 ㅈ줘
r
StarRocks의 내장 카탈로그(Internal Catalog)에서 *= (등호) 조건*과 범위(Range) 조회 성능을 모두 최적화하려면, StarRocks의 2단계 데이터 분산 구조(Partitioning + Bucketing)와 정렬 키(Sort Key) 설정을 전략적으로 결합해야 합니다. 가이드는 다음과 같습니다. 1. 파티셔닝(Partitioning): 범위 조회(Range) 최적화 파티션은 데이터를 시간이나 특정 범위 단위로 크게 나누는 첫 번째 단계입니다. * 설계 원칙: 주로 `DATE`나
DATETIME
같은 시간 컬럼을 기준으로
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`로 특정 사용자를 찾는 경우가 많을 때의 설계 예시입니다.
Copy code
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(...)
설정 시, 등호 조건 컬럼을 앞쪽에, 범위 조건 컬럼을 뒤쪽에 배치하여 인덱스 효율 극대화. 이 구조를 따르면 대규모 데이터에서도 특정 조건의 데이터를 단 몇 개의 태블릿 스캔만으로 빠르게 읽어올 수 있습니다. Referencestable_design/data_distribution/Data_distribution.mdtable_design/StarRocks_table_design.mdbest_practices/query_tuning/schema_tuning.mdbest_practices/bucketing.md
s
@Rocky 저번에 Primary Key 테이블이면 insert할때 sorting이 자동으로 된다고했는데, 확실해? 근거가뭐야? 근거가 되는 문서 제공해줘봐
r
네, *Primary Key 테이블(이하 PK 테이블) 생성 시 데이터를 정렬하여 저장하는 것은 확실한 사실*이며, 이는 StarRocks의 저장 엔진 설계의 핵심 원칙입니다. 그 근거와 동작 방식에 대한 상세 내용은 다음과 같습니다. 1. 공식 문서상의 근거 (Evidence) StarRocks 공식 문서의 "Table clustering""Primary Key table" 섹션에서 이를 명시하고 있습니다. * 동작 원리 명시: "Ingest: rows land in a MemTable, are sorted by the declared sort key, and then flushed as a new Rowset containing one or more ordered Segments." (참고: Table clustering) * 정렬 키 설정: "During data loading, the data is stored after being sorted according to the sort key... If no sort key is specified, the Prefix index are built based on the Primary Key." (참고: Primary Key table) 2. 왜 자동으로 정렬되나요? (The "Why") StarRocks는 *LSM-Tree(Log-Structured Merge-Tree)*와 유사한 구조를 사용합니다. 데이터가 들어올 때 다음과 같은 단계를 거치기 때문에 정렬이 필연적으로 발생합니다. 1. MemTable(메모리 버퍼): 데이터가 `INSERT`되면 먼저 메모리상의 `MemTable`이라는 곳에 쌓입니다. 2. 메모리 내 정렬: 버퍼가 가득 차거나 커밋이 발생하면, StarRocks는 메모리 내의 데이터를 정렬 키(Sort Key) 기준으로 정렬합니다. 3. 플러시(Flush): 정렬된 상태 그대로 디스크에 Segment 파일 형태로 씁니다. 이렇게 만들어진 파일은 이미 내부적으로 정렬되어 있으므로, 나중에 데이터를 찾을 때 이진 탐색(Binary Search)이 가능해집니다. 3. PK 테이블에서 무엇을 기준으로 정렬하나요? * v3.0 이전: Primary Key 자체가 무조건 정렬 키(Sort Key)가 되었습니다. * v3.0 이후: *Primary Key와 Sort Key가 분리(Decoupled)*되었습니다. * `ORDER BY`절을 사용하여 별도의 정렬 키를 지정할 수 있습니다. * 만약 `ORDER BY`를 명시하지 않으면, *정의한 Primary Key 컬럼들*을 기준으로 자동 정렬됩니다. 4. 정렬이 주는 이득 (Prefix Index) StarRocks는 데이터가 정렬되어 있다는 점을 이용해서 약 1024행마다 데이터의 첫 번째 값을 기록하는 *Short Key Index(Prefix Index)*를 자동으로 생성합니다. 이 인덱스는 메모리에 상주하며, 쿼리 시 정렬된 파일들 중 어느 부분을 읽어야 할지 즉각적으로 판단하게 해줍니다. 결론적으로: StarRocks PK 테이블은 쓰기 성능과 읽기 성능의 균형을 위해 *메모리에서 정렬 후 디스크에 기록*하는 방식을 사용하며, 이는 공식 문서에 명확히 기술된 표준 동작입니다. Referencestable_design/table_types/primary_key_table.mdbest_practices/table_clustering.mdtable_design/indexes/Prefix_index_sort_key.md Referencestable_design/table_types/primary_key_table.mdknowledge/usage/best-practice.mdtable_design/indexes/Prefix_index_sort_key.md