Sangwon
06/23/2026, 7:45 AMRocky
06/23/2026, 7:46 AMYYYYMMDD 형태의 STRING 컬럼을 *Dynamic Partitioning(레거시 방식)*에 직접 사용하는 것은 불가능합니다. 레거시 Dynamic Partitioning(dynamic_partition.enable 설정 방식)은 파티션 컬럼이 반드시 DATE 또는 DATETIME 타입이어야 합니다.
하지만 사용 중인 StarRocks 버전에 따라 다음과 같은 해결 방법이 있습니다.
1. v3.4 이상인 경우 (가장 권장되는 방식)
StarRocks v3.4부터는 *Expression Partitioning(식 기반 파티셔닝)*이 대폭 강화되어, str2date 함수를 사용하여 STRING 컬럼을 직접 파티션 키로 정의할 수 있습니다. 이 방식은 데이터를 넣을 때 파티션을 자동으로 생성하므로 기존의 Dynamic Partitioning 설정을 대체할 수 있습니다.
sql
CREATE TABLE my_table (
date_str STRING NOT NULL, -- '20231027' 형태의 문자열
id INT,
data VARCHAR(100)
)
PARTITION BY str2date(date_str, '%Y%m%d') -- 문자열을 날짜로 변환하여 파티셔닝
DISTRIBUTED BY HASH(id)
PROPERTIES (
"partition_live_number" = "30" -- (선택사항) 최근 30개의 파티션만 유지 (TTL 기능)
);
* 장점: 별도의 백그라운드 설정 없이 데이터 로딩 시 자동으로 파티션이 생성됩니다.
* 참고: partition_live_number 속성을 통해 과거 파티션 자동 삭제(TTL)도 가능합니다.
2. v3.1 ~ v3.3인 경우 (Generated Column 활용)
이 버전들에서는 *Generated Column(생성 컬럼)*을 사용하여 문자열을 날짜 타입으로 변환한 뒤, 그 컬럼에 Dynamic Partitioning을 적용할 수 있습니다.
sql
CREATE TABLE my_table (
date_str STRING NOT NULL,
-- 문자열을 DATE 타입으로 변환하는 생성 컬럼 추가
event_day DATE AS str2date(date_str, '%Y%m%d'),
id INT
)
DUPLICATE KEY(date_str, event_day)
PARTITION BY RANGE(event_day) () -- 생성 컬럼을 기반으로 파티셔닝
DISTRIBUTED BY HASH(id)
PROPERTIES (
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.end" = "3",
"dynamic_partition.prefix" = "p"
);
요약
* 직접 사용 가능한가? 아니요, STRING 타입은 레거시 Dynamic Partitioning에서 직접 지원되지 않습니다.
* 해결책:
* v3.4 이상: PARTITION BY str2date(컬럼, '%Y%m%d') 방식을 사용하세요.
* v3.4 미만: DATE 타입의 생성 컬럼(Generated Column)을 만들어 해당 컬럼에 Dynamic Partitioning을 적용하세요.
가급적 성능과 관리 편의성이 뛰어난 v3.4 이상의 Expression Partitioning 사용을 추천드립니다.
References
• table_design/data_distribution/dynamic_partitioning.mdSangwon
06/23/2026, 7:46 AMRocky
06/23/2026, 7:47 AMdate_trunc, time_slice, str2date (v3.4+) 등.
3. 데이터 타입 제약 해소:
* 기존에는 `DATE`/`DATETIME` 타입만 가능했지만, 이제는 STRING, INT 등 다양한 타입을 지원하며, 함수를 통해 변환하여 사용할 수 있습니다.
주요 사용 예시
1. 날짜 함수 사용 (v3.0+)
가장 일반적인 방식으로, DATETIME 컬럼을 일단위(DAY)로 잘라서 파티셔닝합니다.
sql
CREATE TABLE site_access (
event_day DATETIME,
site_id INT
)
PARTITION BY date_trunc("day", event_day) -- 일 단위로 자동 파티셔닝
DISTRIBUTED BY HASH(site_id);
2. 문자열 컬럼 직접 사용 (v3.1+)
STRING 컬럼의 고유 값별로 파티션을 나눌 수 있습니다 (List Partitioning과 유사하지만 자동 생성됨).
sql
CREATE TABLE users (
city STRING,
user_id INT
)
PARTITION BY (city) -- 'Seoul', 'Tokyo' 등 데이터가 들어올 때마다 파티션 자동 생성
DISTRIBUTED BY HASH(user_id);
3. 문자열을 날짜로 변환 (v3.4+)
질문하신 yyyymmdd 형태의 문자열을 다룰 때 가장 권장되는 방식입니다.
sql
CREATE TABLE sales_data (
order_date STRING, -- '20231027'
amount INT
)
PARTITION BY str2date(order_date, '%Y%m%d')
DISTRIBUTED BY HASH(amount);
관리 속성 (PROPERTIES)
Expression Partitioning을 사용할 때 함께 쓰면 좋은 설정들입니다.
* `"partition_live_number" = "30"`: 최신 파티션을 30개만 유지하고 오래된 파티션은 자동으로 삭제합니다 (TTL 기능).
* `"auto_partition_max_creation_number_per_load" = "4096"`: 한 번의 로딩으로 생성될 수 있는 최대 파티션 수를 제한하여 실수로 수만 개의 파티션이 생기는 것을 방지합니다.
요약: 레거시 Dynamic Partitioning과의 차이점
구분 | Dynamic Partitioning (Legacy) | Expression Partitioning (Recommended)
생성 시점 | 백그라운드에서 주기적으로 미리 생성 | 데이터 로딩 시점에 실시간 생성
지원 타입 | DATE, DATETIME 필수 | STRING, INT, 함수 결과 등 지원
설정 복잡도 | 복잡함 (prefix, start, end 등) | 매우 단순 (PARTITION BY 함수)
권장 버전 | v2.x 이하 | v3.4 이상 강력 권장
이제는 별도의 Dynamic Partition 설정을 복잡하게 구성하기보다, *`PARTITION BY` 문에 함수를 사용*하는 이 방식을 사용하시는 것이 훨씬 효율적입니다.
References
• table_design/data_distribution/expression_partitioning.md
ingestion_expression_partitioning)
• table_design/data_distribution/expression_partitioning.md
References
• table_design/data_distribution/expression_partitioning.mdSangwon
06/23/2026, 7:52 AMRocky
06/23/2026, 7:52 AMSTRING 컬럼에 대해 `PARTITION BY (dt)`를 직접 사용하면서 `partition_live_number`를 설정하는 것은 작동하지 않습니다.
그 이유는 다음과 같습니다.
1. 왜 안 되나요?
`partition_live_number`는 StarRocks가 *현재 날짜(Current Date)*를 기준으로 "어떤 파티션이 오래된 파티션인지"를 계산하여 삭제하는 기능입니다.
* 단순히 `PARTITION BY (dt)`라고만 설정하면 StarRocks는 dt 컬럼을 단순한 값(List)들의 집합으로 인식합니다.
* `dt`가 STRING 타입이면 내부의 값이 '20231027'일지라도, DB 입장에서는 이것이 날짜인지 단순 문자열인지 알 수 없으므로 시간 순서에 따른 자동 삭제(TTL)를 수행할 수 없습니다.
2. 해결 방법: str2date 함수 사용 (v3.4 이상 권장)
`partition_live_number`를 사용하고 싶다면, PARTITION BY 절에서 해당 컬럼이 *날짜 타입임*을 명시적으로 알려줘야 합니다.
sql
CREATE TABLE my_table (
dt STRING NOT NULL, -- '20231027' 형태
id INT,
data VARCHAR(100)
)
-- 1. str2date를 통해 문자열을 날짜로 변환하여 파티셔닝
PARTITION BY str2date(dt, '%Y%m%d')
DISTRIBUTED BY HASH(id)
PROPERTIES (
-- 2. 이제 날짜 계산이 가능하므로 TTL 설정이 작동합니다.
"partition_live_number" = "30"
);
3. StarRocks v3.5 이상의 대안: partition_retention_condition
만약 최신 버전(v3.5+)을 사용 중이라면, 더 유연한 조건인 `partition_retention_condition`을 사용할 수 있습니다. 이 방식은 문자열 컬럼이라 하더라도 비교 연산이 가능하다면 조건을 걸어 삭제할 수 있습니다.
sql
PROPERTIES (
-- dt가 '20231027' 형태의 문자열일 때, 비교 연산을 통해 유지 조건 설정
"partition_retention_condition" = "dt >= '20240101'"
)
요약
* STRING 컬럼 그대로 `PARTITION BY (dt)`만 사용하면 `partition_live_number`(TTL)는 작동하지 않습니다.
* 해결책: `PARTITION BY str2date(dt, '%Y%m%d')`를 사용하여 시스템이 날짜를 인식하게 만드세요. 이렇게 하면 별도의 복잡한 설정 없이도 자동으로 파티션이 생성되고, 오래된 파티션은 지정한 개수만큼만 남고 삭제됩니다.
References
• table_design/data_distribution/expression_partitioning.md
• sql_reference/sql_statements/table_bucket_part_index/CREATE_TABLE.md
References
• table_design/data_distribution/expression_partitioning.md
• best_practices/partitioning.md
• table_design/data_distribution/dynamic_partitioning.mdSangwon
06/23/2026, 7:57 AMSangwon
06/23/2026, 7:58 AMRocky
06/23/2026, 7:59 AMPARTITION BY (dt) (Automatic Partitioning)로 설정된 STRING 타입 컬럼에 대해 `partition_retention_condition`을 사용하여 TTL(자동 삭제)을 적용할 수 있습니다.
상세 내용 및 주의사항
1. 버전 요구사항: 이 기능은 *v3.5.0*부터 지원됩니다. 그 미만 버전에서는 STRING 컬럼에 대해 이 조건문 설정이 불가능합니다.
2. 데이터 형식 (YYYYMMDD):
* StarRocks는 '20241027' 같은 YYYYMMDD 형식의 문자열을 날짜로 비교하는 것을 지원합니다.
* 따라서 `dt >= CURRENT_DATE() - INTERVAL 3 MONTH`라는 조건식은 내부적으로 dt 컬럼의 값을 날짜로 변환하여 비교하므로 의도한 대로 작동합니다.
3. 작동 방식:
* `PARTITION BY (dt)`는 dt 컬럼의 고유값마다 파티션을 생성하는 List Partitioning 방식으로 동작합니다.
* StarRocks는 주기적으로 `partition_retention_condition`을 체크하여, 해당 조건에 부합하지 않는(즉, 너무 오래된) 파티션을 자동으로 삭제합니다.
권장되는 테이블 생성 예시 (v3.5+)
sql
CREATE TABLE my_table (
dt STRING NOT NULL, -- '20231027' 형태
id INT,
data VARCHAR(100)
)
PARTITION BY (dt) -- dt 값에 따라 자동 파티션 생성
DISTRIBUTED BY HASH(id)
PROPERTIES (
-- v3.5 이상에서 지원되는 파티션 유지 조건
"partition_retention_condition" = "dt >= CURRENT_DATE() - INTERVAL 3 MONTH"
);
주의할 점
* 성능: `dt`가 단순 문자열이므로, 파티션 삭제 시점의 비교 연산 비용이 아주 미세하게 발생할 수 있으나 큰 문제는 되지 않습니다.
* 오타 주의: 문자열 값 중 날짜 형식이 아닌 데이터(예: 'N/A', '000000')가 섞여 들어올 경우, 비교 연산 시 오류가 발생하거나 해당 파티션이 삭제되지 않을 수 있으니 데이터 정제에 유의해야 합니다.
만약 v3.5 미만 버전을 사용 중이시라면, 앞서 말씀드린 대로 `PARTITION BY str2date(dt, '%Y%m%d')`와 partition_live_number 조합을 사용하셔야 합니다.
References
• table_design/data_distribution/expression_partitioning.md
• sql_reference/sql_statements/table_bucket_part_index/CREATE_TABLE.md
• best_practices/partitioning.md
References
• table_design/data_distribution/expression_partitioning.md
• faq/Sql_faq.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.mdRocky
06/23/2026, 8:01 AMSTRING 타입의 dt 컬럼에도 TTL(보관 주기) 설정을 적용할 수 있습니다.
질문하신 설정은 다음과 같은 원리로 작동합니다.
1. 작동 원리
* v3.5+ 신기능: `partition_retention_condition`은 StarRocks v3.5부터 도입된 기능으로, 기존의 `partition_live_number`보다 훨씬 유연합니다.
* 자동 형변환: StarRocks는 '20231027' 같은 yyyymmdd 형식의 문자열을 DATE 타입과 비교할 때 내부적으로 `DATE`로 변환(Implicit Cast)하여 처리할 수 있습니다.
* List 파티션 지원: `PARTITION BY (dt)`와 같이 컬럼을 직접 지정하면 StarRocks는 이를 *List 파티션*으로 취급합니다. v3.5의 이 속성은 List 파티션에 대해 표현식 결과를 기반으로 파티션을 삭제하는 기능을 지원합니다.
2. 권장되는 테이블 생성 구문
sql
CREATE TABLE my_table (
dt STRING NOT NULL, -- '20231027' 형식
id INT,
data VARCHAR(100)
)
PARTITION BY (dt) -- List 파티셔닝 (데이터 로드 시 자동 생성)
DISTRIBUTED BY HASH(id)
PROPERTIES (
-- v3.5 이상에서 작동: 3개월 이전 파티션 자동 삭제
"partition_retention_condition" = "dt >= CURRENT_DATE() - INTERVAL 3 MONTH"
);
3. 주의사항 및 확인사항
1. 버전 확인: 반드시 *v3.5.0 이상*이어야 합니다. 그 하위 버전에서는 이 속성을 인식하지 못하거나 무시합니다.
2. 문자열 형식: dt 컬럼의 값이 `'2024-05-01'`이 아닌 '20240501' 형태여도 StarRocks의 비교 연산자(>=)는 이를 날짜로 해석하여 계산할 수 있습니다. (단, 형식이 깨진 데이터가 들어있으면 삭제 로직이 의도치 않게 동작할 수 있으니 주의가 필요합니다.)
3. 수동 확인: 설정 후 파티션이 실제로 삭제되는지 확인하려면 다음 명령어를 사용하세요.
sql
SHOW PARTITIONS FROM my_table;
4. 성능 고려: `PARTITION BY (dt)`를 사용하면 매일 새로운 파티션이 생깁니다. 수년 치 데이터를 쌓아 파티션 개수가 너무 많아지면(수천 개 이상) 성능에 영향을 줄 수 있으므로, 이 Retention 설정을 통해 주기적으로 관리해주는 것이 매우 좋은 선택입니다.
결론: v3.5 이상이라면 말씀하신 방식(partition_retention_condition)으로 STRING 컬럼에 대한 기간 기반 자동 삭제가 가능합니다.
References
• table_design/data_distribution/expression_partitioning.md
• sql_reference/sql_statements/table_bucket_part_index/CREATE_TABLE.md
• table_design/data_distribution/Data_distribution.md
• administration/management/resource_management/Resource_group.md
-deprecated)
• administration/management/resource_management/Resource_group.md
• table_design/data_distribution/Data_distribution.md
• table_design/data_distribution/Data_distribution.md
• sql_reference/sql_statements/table_bucket_part_index/CREATE_TABLE.md
• table_design/data_distribution/expression_partitioning.md
• sql_reference/sql_statements/table_bucket_part_index/CREATE_TABLE.md
• sql_reference/sql_statements/table_bucket_part_index/CREATE_TABLE.md
• sql_reference/sql_statements/table_bucket_part_index/CREATE_TABLE.md
• sql_reference/sql_statements/table_bucket_part_index/CREATE_TABLE.md
• sql_reference/sql_statements/table_bucket_part_index/CREATE_TABLE.md
• sql_reference/sql_statements/table_bucket_part_index/CREATE_TABLE.mdRocky
06/23/2026, 8:01 AMRocky
06/23/2026, 8:01 AMRocky
06/23/2026, 8:01 AMRocky
06/23/2026, 8:01 AMRocky
06/23/2026, 8:01 AMRocky
06/23/2026, 8:01 AMRocky
06/23/2026, 8:01 AMRocky
06/23/2026, 8:01 AMRocky
06/23/2026, 8:01 AM