<@U0A71G31CDV> partition by (dt) 했는데 dt가 varchar인 ...
# questions-and-troubleshooting
s
@Rocky partition by (dt) 했는데 dt가 varchar인 yyyymmdd 형식인데 dynamic partition이 적용돼?
r
StarRocks에서
VARCHAR
타입의
yyyymmdd
형식 컬럼(
dt
)을 사용하여 파티션을 관리하는 방법은 크게 두 가지가 있으며, 사용하시는 버전에 따라 권장하는 방식이 다릅니다. 1. 자동 파티션 생성 (Automatic Partitioning) v3.1부터 지원되는 Expression Partitioning 기능을 사용하면
VARCHAR
타입 컬럼으로도 데이터 로딩 시 파티션을 자동으로 생성할 수 있습니다.
Copy code
sql
CREATE TABLE example_table (
    dt VARCHAR(8) NOT NULL,
    id INT,
    data VARCHAR(100)
)
DUPLICATE KEY(dt, id)
PARTITION BY (dt) -- dt 값에 따라 파티션 자동 생성
DISTRIBUTED BY HASH(id);
* 특징: 별도의
dynamic_partition
속성을 설정하지 않아도,
20231027
같은 값이 들어오면 `p20231027`이라는 파티션이 자동으로 만들어집니다. * 주의: 이 방식은 단순히 문자열 값에 기반하므로, '미래 파티션 미리 생성'이나 '오래된 파티션 자동 삭제(TTL)' 같은 정교한 시간 기반 관리가 어려울 수 있습니다. (v3.5 이상에서는 `partition_retention_condition`으로 보완 가능) 2. 함수 기반 파티셔닝 (v3.3 이상 권장) 문자열(
yyyymmdd
)을 날짜처럼 인식하게 하여 *Dynamic Partitioning(속성 기반 관리)*의 이점을 누리고 싶다면
str2date
함수를 사용하는 것이 가장 좋습니다.
Copy code
sql
CREATE TABLE example_table (
    dt VARCHAR(8) NOT NULL,
    ...
)
PARTITION BY RANGE (str2date(dt, '%Y%m%d')) (
    START ("2024-01-01") END ("2024-01-10") EVERY (INTERVAL 1 DAY)
)
PROPERTIES (
    "dynamic_partition.enable" = "true",
    "dynamic_partition.time_unit" = "DAY",
    "dynamic_partition.end" = "3" -- 3일치 파티션 미리 생성
);
* v3.3 이전: Dynamic Partitioning은 기본적으로
DATE
또는
DATETIME
타입 컬럼만 지원했습니다. `VARCHAR`는 직접적으로는
dynamic_partition
속성이 정상 작동하지 않을 수 있습니다. * v3.3 이후: 위 예시처럼
str2date
함수를 통해 `VARCHAR`를 날짜로 변환하여 파티션을 정의하면, 기존의 Dynamic Partitioning 속성(
start
,
end
등)을 그대로 활용할 수 있습니다. 요약 * 단순히 파티션이 생기기만 하면 된다면: `PARTITION BY (dt)`를 사용하세요. (v3.1+) * 미리 생성하거나 자동 삭제(TTL) 기능이 필요하다면: * 가급적
dt
컬럼 타입을 `DATE`로 바꾸는 것이 가장 깔끔합니다. * `VARCHAR`를 유지해야 한다면 v3.3 이상의
str2date
기반 Range Partition
설정을 권장합니다. * *v3.3 미만 버전*에서
VARCHAR
컬럼에 `dynamic_partition.enable`을 직접 걸면, FE에서 날짜 계산을 못해 에러가 발생하거나 파티션 생성이 안 될 수 있습니다. Referencesfaq/Sql_faq.mdtable_design/data_distribution/dynamic_partitioning.mdtable_design/data_distribution/expression_partitioning.mdtable_design/data_distribution/Data_distribution.md
s
@Rocky partitions by(str2date(dt)) 이렇게만 했는데 dynamic_partition 이 적용이되나?
r
`PARTITION BY (str2date(dt, '%Y%m%d'))`와 같이 작성하셨다면, 별도의
dynamic_partition
설정을 하지 않아도 "자동 파티션 생성(Automatic Partitioning)" 기능이 적용됩니다. StarRocks v3.1부터 도입된 이 기능은 기존의 Dynamic Partitioning(주기적으로 미리 생성하는 방식)과는 동작 방식이 다르지만, 결과적으로 파티션을 자동 관리해준다는 점은 같습니다. 1. 동작 방식 (Automatic Partitioning) * 시점: 데이터가 *로딩(INSERT, STREAM LOAD 등)되는 시점*에 해당 값에 맞는 파티션이 없으면 StarRocks가 즉석에서 파티션을 생성합니다. * 설정:
PROPERTIES ("dynamic_partition.enable" = "true")
같은 추가 설정이 필요 없습니다. * 결과:
dt
값이 `'20231027'`인 데이터를 넣으면,
str2date
함수가 이를
2023-10-27
날짜로 변환하고, 해당 날짜에 맞는 파티션을 자동으로 만듭니다. 2. 주의사항 및 권장 사항 1. 함수 인자:
str2date(dt)
처럼 인자를 하나만 쓰면 형식을 알 수 없어 에러가 날 수 있습니다. 반드시
str2date(dt, '%Y%m%d')
형식을 사용하세요. 2. 데이터 타입:
str2date
결과는
DATE
타입이므로, 날짜 기반의 파티션 관리가 가능해집니다. 3. 버전 확인: 이 기능은 *v3.1 이상*에서 지원됩니다. 4. 보관 정책(TTL): 자동 생성된 파티션을 일정 기간 후 자동으로 지우고 싶다면, v3.5부터 지원되는
partition_retention_condition
속성을 함께 사용하는 것이 좋습니다. (이전 버전에서는 자동 삭제를 위해 별도의 관리가 필요할 수 있습니다.) 3. 기존 Dynamic Partitioning과의 차이점 * 기존 방식 (
dynamic_partition.enable
):
FE가 백그라운드에서 스케줄에 따라 파티션을 미리 만들어둡니다. * 현재 방식 (
PARTITION BY
표현식):
데이터가 들어올 때 필요한 파티션을 만듭니다. 결론적으로, `str2date`를 사용한 표현식 파티셔닝은 "자동으로 파티션을 생성"해준다는 목적을 달성하므로, 의도하신 대로 파티션 관리가 자동화됩니다. Referencestable_design/data_distribution/expression_partitioning.mdtable_design/data_distribution/Data_distribution.mdsql-reference/sql-statements/materialized_view/CREATE_MATERIALIZED_VIEW.md Referencestable_design/data_distribution/expression_partitioning.mdtable_design/data_distribution/dynamic_partitioning.mdsql-reference/sql-statements/materialized_view/CREATE_MATERIALIZED_VIEW.mdtable_design/data_distribution/Data_distribution.md