본문으로 건너뛰기
최종 수정: 에

동적 파티셔닝

파티션 관리 방식 선택

동적 파티셔닝은 일정에 따라 파티션을 생성하고 삭제합니다. 데이터가 들어올 때 필요에 따라 파티션을 생성해야 한다면 자동 파티셔닝을 사용하세요. 일정 기간을 유지할지, 일정 개수의 과거 파티션을 유지할지에 따라 보존 방식을 선택하세요.

동적 파티셔닝은 설정된 규칙에 따라 파티션을 순차적으로 추가하고 삭제하여 테이블의 파티션 수명 주기 관리(TTL)를 제공하고 데이터 저장 공간의 부담을 줄입니다. 로그 관리 및 시계열 데이터 관리와 같은 시나리오에서는 만료된 데이터를 순차적으로 삭제하는 데 동적 파티셔닝을 주로 사용합니다.

적용 시나리오​

시나리오설명
로그 데이터 관리일 또는 시간 단위로 최근 N일의 로그를 보존하고 만료된 파티션을 자동으로 삭제합니다
시계열 데이터 관리모니터링, IoT 등의 시나리오에서 시간 축을 따라 파티션을 자동으로 관리합니다
데이터 수명 주기 관리TTL을 사용하여 데이터 보존 범위를 제어하고 저장 비용을 줄입니다
향후 파티션 미리 생성향후 N일의 파티션을 미리 생성하여 파티션 누락으로 인한 쓰기 실패를 방지합니다

다음 그림은 동적 파티셔닝을 사용한 수명 주기 관리 예제입니다. 이 예제에서는 다음 규칙을 지정합니다.

  • 스케줄링 단위 dynamic_partition.time_unit은 DAY로, 파티션을 일 단위로 구성합니다.
  • 시작 오프셋 dynamic_partition.start는 -1로 설정하여 하루 전 파티션을 보존합니다.
  • 종료 오프셋 dynamic_partition.end는 2로 설정하여 향후 이틀의 파티션을 보존합니다.

이 규칙에 따라 시간이 지나도 하루 전 파티션, 당일 파티션, 향후 이틀의 파티션까지 항상 네 개의 파티션이 유지됩니다.

동적 파티션

제한 사항​

동적 파티셔닝을 사용할 때는 다음 제한 사항이 적용됩니다.

  • 동적 파티셔닝은 DATE, DATETIME 또는 TIMESTAMP_NS 컬럼에 대한 Range 파티셔닝만 지원합니다.
  • 동적 파티셔닝은 단일 파티션 키만 지원합니다.

동적 파티션 테이블 생성​

테이블 생성 시 dynamic_partition 속성을 지정하여 동적 파티션 테이블을 생성할 수 있습니다.

CREATE TABLE test_dynamic_partition(
order_id BIGINT,
create_dt DATE,
username VARCHAR(20)
)
DUPLICATE KEY(order_id)
PARTITION BY RANGE(create_dt) ()
DISTRIBUTED BY HASH(order_id) BUCKETS 10
PROPERTIES(
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-1",
"dynamic_partition.end" = "2",
"dynamic_partition.prefix" = "p",
"dynamic_partition.create_history_partition" = "true"
);

dynamic_partition 매개변수에 대한 자세한 내용은 동적 파티션 속성을 참조하세요.

동적 파티션 관리​

동적 파티션 속성 수정​

팁

ALTER TABLE 문으로 동적 파티션을 수정해도 즉시 적용되지는 않습니다. Doris는 dynamic_partition_check_interval_seconds에 지정된 간격으로 동적 파티션을 확인하고 필요한 파티션 생성 및 삭제 작업을 수행합니다.

다음 예제에서는 ALTER TABLE 문을 사용하여 일반 파티션 테이블을 동적 파티션 테이블로 변환합니다.

CREATE TABLE test_partition(
order_id BIGINT,
create_dt DATE,
username VARCHAR(20)
)
DUPLICATE KEY(order_id)
PARTITION BY RANGE(create_dt) ()
DISTRIBUTED BY HASH(order_id) BUCKETS 10;

ALTER TABLE test_partition SET (
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-1",
"dynamic_partition.end" = "2",
"dynamic_partition.prefix" = "p",
"dynamic_partition.create_history_partition" = "true"
);

동적 파티션 스케줄링 상태 확인​

SHOW-DYNAMIC-PARTITION을 사용하면 현재 데이터베이스에 있는 모든 동적 파티션 테이블의 스케줄링 상태를 확인할 수 있습니다.

SHOW DYNAMIC PARTITION TABLES;
+-----------+--------+----------+-------------+------+--------+---------+-----------+----------------+---------------------+--------+------------------------+----------------------+-------------------------+
| TableName | Enable | TimeUnit | Start | End | Prefix | Buckets | StartOf | LastUpdateTime | LastSchedulerTime | State | LastCreatePartitionMsg | LastDropPartitionMsg | ReservedHistoryPeriods |
+-----------+--------+----------+-------------+------+--------+---------+-----------+----------------+---------------------+--------+------------------------+----------------------+-------------------------+
| d3 | true | WEEK | -3 | 3 | p | 1 | MONDAY | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | [2021-12-01,2021-12-31] |
| d5 | true | DAY | -7 | 3 | p | 32 | N/A | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL |
| d4 | true | WEEK | -3 | 3 | p | 1 | WEDNESDAY | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL |
| d6 | true | MONTH | -2147483648 | 2 | p | 8 | 3rd | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL |
| d2 | true | DAY | -3 | 3 | p | 32 | N/A | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL |
| d7 | true | MONTH | -2147483648 | 5 | p | 8 | 24th | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL |
+-----------+--------+----------+-------------+------+--------+---------+-----------+----------------+---------------------+--------+------------------------+----------------------+-------------------------+
7 rows in set (0.02 sec)

과거 파티션 관리​

start 및 end 속성으로 동적 파티션 수를 지정할 때, 모든 파티션을 한 번에 생성하면서 발생하는 긴 대기 시간을 피하기 위해 기본적으로 과거 파티션은 생성하지 않습니다. 현재 시점 이후의 파티션만 생성합니다. 모든 파티션을 한 번에 생성하려면 create_history_partition 매개변수를 활성화하세요.

예를 들어 현재 날짜가 2024-10-11이고 start = -2, end = 2로 지정한 경우:

  • create_history_partition = true이면 5개의 파티션이 [10-09, 10-13] 범위에 대해 즉시 생성됩니다.
  • create_history_partition = false이면 3개의 파티션만 [10-11, 10-13] 범위에 대해 생성됩니다.

동적 파티션 매개변수​

동적 파티션 속성​

동적 파티션 규칙 매개변수는 dynamic_partition 접두사를 사용합니다. 다음 규칙 매개변수를 사용할 수 있습니다.

매개변수필수 여부설명
dynamic_partition.enable아니요동적 파티셔닝 기능의 활성화 여부입니다. TRUE 또는 FALSE로 설정할 수 있습니다. 다른 필수 동적 파티션 매개변수가 지정되어 있으면 기본값은 TRUE입니다.
dynamic_partition.time_unit예동적 파티셔닝의 스케줄링 단위입니다. HOUR, DAY, WEEK, MONTH 또는 YEAR로 설정할 수 있으며, 각각 시간, 일, 주, 월 또는 연 단위로 파티션을 생성하거나 삭제함을 의미합니다.
dynamic_partition.start아니요동적 파티셔닝의 시작 오프셋으로, 음수로 지정합니다. 기본값은 -2147483648이며, 과거 파티션을 삭제하지 않음을 의미합니다. time_unit 속성에 따라 현재 날짜(주 / 월)를 기준으로 이 오프셋보다 이전 범위의 파티션을 삭제합니다. 이 오프셋과 현재 시점 사이의 과거 파티션이 없을 때 이를 생성할지는 dynamic_partition.create_history_partition으로 제어합니다.
dynamic_partition.end예동적 파티셔닝의 종료 오프셋으로, 양수로 지정합니다. time_unit 속성에 따라 현재 날짜(주 / 월)를 기준으로 해당 범위의 파티션을 미리 생성합니다.
dynamic_partition.prefix예동적으로 생성되는 파티션 이름의 접두사입니다.
dynamic_partition.buckets아니요동적으로 생성되는 파티션의 버킷 수입니다. 이 매개변수를 설정하면 DISTRIBUTED에 지정된 버킷 수를 재정의합니다.
dynamic_partition.replication_num아니요동적으로 생성되는 파티션의 복제본 수입니다. 지정하지 않으면 테이블 생성 시 지정한 복제본 수를 기본값으로 사용합니다.
dynamic_partition.create_history_partition아니요기본값은 false입니다. true로 설정하면 Doris는 아래에 설명된 규칙에 따라 모든 파티션을 자동으로 생성합니다. 동시에 FE 매개변수 max_dynamic_partition_num은 한 번에 너무 많은 파티션이 생성되지 않도록 전체 파티션 수를 제한합니다. 생성할 파티션 수가 max_dynamic_partition_num을 초과하면 작업이 거부됩니다. start 속성을 지정하지 않으면 이 매개변수는 적용되지 않습니다.
dynamic_partition.history_partition_num아니요create_history_partition이 true일 때 생성할 과거 파티션 수를 지정합니다. 기본값은 -1로, 설정되지 않았음을 의미합니다. 이 변수는 dynamic_partition.start와 동일한 효과를 가지므로 둘 중 하나만 설정하는 것이 좋습니다.
dynamic_partition.start_day_of_week아니요time_unit이 WEEK일 때 한 주의 시작 요일을 지정합니다. 유효 범위는 1부터 7까지이며, 1은 월요일, 7은 일요일을 의미합니다. 기본값은 1로, 월요일이 한 주의 시작입니다.
dynamic_partition.start_day_of_month아니요time_unit이 MONTH일 때 한 달의 시작일을 지정합니다. 유효 범위는 1부터 28까지이며, 1은 매월 1일, 28은 매월 28일을 의미합니다. 기본값은 1로, 매월 1일이 한 달의 시작입니다. 윤년이나 월별 일수 차이로 인한 모호함을 방지하기 위해 29일, 30일, 31일은 시작일로 지원하지 않습니다.
dynamic_partition.reserved_history_periods아니요보존할 과거 파티션의 시간 범위입니다. dynamic_partition.time_unit이 DAY / WEEK / MONTH / YEAR인 경우 값을 [yyyy-MM-dd,yyyy-MM-dd],[...,...] 형식으로 설정합니다. dynamic_partition.time_unit이 HOUR인 경우 값을 [yyyy-MM-dd HH:mm:ss,yyyy-MM-dd HH:mm:ss],[...,...] 형식으로 설정합니다. 설정하지 않으면 기본값은 "NULL"입니다.
dynamic_partition.time_zone아니요동적 파티셔닝에 사용할 시간대입니다. 기본값은 현재 서버의 시스템 시간대이며, 예를 들어 Asia/Shanghai입니다. 시간대 설정에 대한 자세한 내용은 시간대 관리를 참조하세요.

FE 구성 매개변수​

FE 구성 파일 또는 ADMIN SET FRONTEND CONFIG 명령을 통해 FE의 동적 파티션 매개변수를 수정할 수 있습니다.

매개변수기본값설명
dynamic_partition_enablefalseDoris에서 동적 파티셔닝 기능을 활성화할지 여부입니다. 이 매개변수는 동적 파티션 테이블의 파티션 작업에만 영향을 주며, 일반 테이블에는 영향을 주지 않습니다.
dynamic_partition_check_interval_seconds600동적 파티션 스레드의 실행 주기이며, 단위는 초입니다.
max_dynamic_partition_num500동적 파티션 테이블 생성 시 한 번에 너무 많은 파티션이 생성되지 않도록 생성 가능한 최대 파티션 수를 제한합니다.

동적 파티셔닝 모범 사례​

예제 1: 로그 데이터의 순차적 보존​

일 단위로 파티션을 나누고, 최근 7일과 당일의 데이터만 보존하며, 향후 3일의 파티션을 미리 생성합니다.

CREATE TABLE tbl1 (
order_id BIGINT,
create_dt DATE,
username VARCHAR(20)
)
PARTITION BY RANGE(create_dt) ()
DISTRIBUTED BY HASH(create_dt)
PROPERTIES (
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-7",
"dynamic_partition.end" = "3",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "32"
);

예제 2: 월 단위 파티셔닝 및 모든 과거 파티션 보존​

월 단위로 파티션을 나누고, 과거 파티션을 삭제하지 않으며, 향후 2개월의 파티션을 미리 생성하고, 매월 3일을 시작일로 설정합니다.

CREATE TABLE tbl1 (
order_id BIGINT,
create_dt DATE,
username VARCHAR(20)
)
PARTITION BY RANGE(create_dt) ()
DISTRIBUTED BY HASH(create_dt)
PROPERTIES (
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "MONTH",
"dynamic_partition.end" = "2",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "8",
"dynamic_partition.start_day_of_month" = "3"
);

예제 3: 지정된 과거 시간 범위 보존​

일 단위로 파티션을 나누고, 최근 10일 및 향후 10일의 파티션을 보존하며, 추가로 [2020-06-01, 2020-06-20] 및 [2020-10-31, 2020-11-15] 기간의 과거 데이터를 보존합니다.

CREATE TABLE tbl1 (
order_id BIGINT,
create_dt DATE,
username VARCHAR(20)
)
PARTITION BY RANGE(create_dt) ()
DISTRIBUTED BY HASH(create_dt)
PROPERTIES (
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-10",
"dynamic_partition.end" = "10",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "8",
"dynamic_partition.reserved_history_periods" = "[2020-06-01,2020-06-20],[2020-10-31,2020-11-15]"
);