<@U0A71G31CDV> starrocks 테이블에 파티션 개수 제한이있어?
# questions-and-troubleshooting
s
@Rocky starrocks 테이블에 파티션 개수 제한이있어?
r
StarRocks 테이블의 파티션 개수에는 시스템 설정에 따른 제한과 성능을 위한 권장 제한이 있습니다. 1. 주요 시스템 제한 (FE 설정) * 테이블당 최대 파티션 수: 기본적으로 한 테이블에 생성할 수 있는 최대 파티션 수는 *100,000개*입니다. * 설정 항목:
max_partition_number_per_table
(v3.3.2 버전부터 도입됨) * 이 기본값은 100,000이지만, FE의 메모리 부하를 고려하여 설정해야 합니다. * 단일 작업당 생성 제한: 한 번의 `CREATE TABLE`이나
ALTER TABLE
구문으로 동시에 생성할 수 있는 파티션 수는 기본 *4,096개*로 제한됩니다. * 설정 항목:
max_partitions_in_one_batch
* 자동 파티션 생성 제한: 데이터 로드 시 자동으로 생성되는 파티션(Expression Partitioning)도 한 번의 로드 작업당 최대 *4,096개*까지로 제한됩니다. * 설정 항목:
auto_partition_max_creation_number_per_load
2. 권장 사항 및 성능 고려사항 시스템적으로는 10만 개까지 가능하지만, 성능 최적화를 위해 다음과 같은 가이드라인을 따르는 것이 좋습니다. * 메타데이터 관리: 너무 많은 파티션은 FE(Frontend)의 메모리 사용량을 증가시키고 쿼리 계획(Query Planning) 시간을 길어지게 할 수 있습니다. 일반적으로 테이블당 파티션 수를 수천 개(약 4,096개 이하) 수준으로 유지하는 것이 관리 면에서 유리합니다. * 데이터 크기: 개별 파티션의 크기는 너무 작지 않게(예: 파티션당 100GB 이하 권장) 유지하고, 각 파티션 내의 태블릿(Tablet) 개수도 적절히 조절하는 것이 중요합니다. * 파티션 입도(Granularity): 너무 세밀한 파티션(예: 초 단위, 분 단위)보다는 비즈니스 요구사항에 맞춰 시간(Hour), 일(Day), 또는 월(Month) 단위로 설정하는 것이 좋습니다. 요약하자면: 기술적으로 테이블당 *100,000개*까지 가능하지만, 원활한 운영과 성능을 위해서는 4,096개 이내로 유지하는 것이 권장됩니다. 필요하다면 FE 설정을 통해 이 제한을 조정할 수 있습니다. References • faq/operation_maintenance_faq.md • knowledge/usage/best-practice.md • best_practices/partitioning.md • faq/Deploy_faq.md • administration/management/FE_configuration.md • knowledge/admin_and_operation/shared_data_compaction.md
s
@Rocky 지금 생성된 테이블의 파티션 개수를 어떻게 확인하지?
r
StarRocks에서 테이블의 파티션 개수를 확인하는 가장 간단한 방법은
SHOW PARTITIONS
명령어를 사용하는 것입니다. 1.
SHOW PARTITIONS
명령어 사용 (가장 일반적)
이 명령어를 실행하면 테이블의 모든 파티션 목록이 출력됩니다. 출력된 결과의 전체 행(Row) 수가 곧 파티션의 개수입니다.
Copy code
sql
SHOW PARTITIONS FROM 테이블명;
* 팁: 결과가 너무 많을 경우, MySQL 클라이언트 등에서 행 수를 직접 확인하거나, 특정 조건으로 필터링(
WHERE
)하여 확인할 수 있습니다. 2.
information_schema
조리 (SQL 쿼리)
만약 쿼리 결과를 통해 개수(Count)만 바로 얻고 싶다면
information_schema.partitions
뷰를 조회할 수 있습니다. (StarRocks 버전에 따라 지원 여부가 다를 수 있으나, 최신 버전에서는 작동합니다.)
Copy code
sql
SELECT COUNT(*) 
FROM information_schema.partitions 
WHERE table_schema = '데이터베이스명' 
  AND table_name = '테이블명';
3.
SHOW PROC
명령어 사용 (관리자용)
시스템 내부 경로를 통해 더 상세한 메타데이터를 확인할 수 있습니다.
Copy code
sql
-- 1. 데이터베이스 ID 확인
SHOW DATABASES; 
-- 2. 해당 DB의 테이블 정보 확인 (여기서 TableId 확인)
SHOW PROC '/dbs/데이터베이스ID';
-- 3. 파티션 개수 확인
SHOW PROC '/dbs/데이터베이스ID/테이블ID/partitions';
참고: * *Dynamic Partitioning*이 설정된 테이블의 경우, 현재 생성된 파티션 외에 앞으로 생성될 파티션 규칙도 함께 확인하려면 `SHOW CREATE TABLE 테이블명;`을 통해 설정값(
dynamic_partition.*
)을 확인하는 것이 좋습니다. References • sql-reference/sql-statements/table_bucket_part_index/SHOW_PARTITIONS.md • sql-reference/information_schema/partitions.md • knowledge/admin_and_operation/shared_data_compaction.md • table_design/data_distribution/Data_distribution.md _distribution/Data_distribution) References • sql-reference/information_schema/partitions.md • sql-reference/sql-statements/table_bucket_part_index/SHOW_PARTITIONS.md • table_design/data_distribution/Data_distribution.md • knowledge/admin_and_operation/shared_data_compaction.md
s
@Rocky 파티션 설정값도 확인해야해
r
테이블의 파티션 설정(파티션 키, 방식, 동적 파티션 여부 등)을 확인하는 방법은 크게 3가지가 있습니다. 1. 테이블 생성 구문 확인 (
SHOW CREATE TABLE
)
테이블이 어떤 파티션 전략(Range, List, Expression 등)으로 생성되었는지, 어떤 컬럼이 파티션 키인지 가장 확실하게 확인할 수 있는 방법입니다.
Copy code
sql
SHOW CREATE TABLE 테이블명;
* 확인할 내용: * `PARTITION BY ...`: 파티션 방식과 파티션 키 컬럼 확인 _ `PROPERTIES`: 동적 파티션(
dynamic_partition._
) 설정값 확인 2. 동적 파티션 설정 상태 확인 (
SHOW DYNAMIC PARTITION TABLES
)
만약 동적 파티션(Dynamic Partitioning)을 사용 중이라면, 현재 활성화 여부와 주기, 미리 생성할 파티션 개수 등의 상세 설정을 한눈에 볼 수 있습니다.
Copy code
sql
-- 현재 DB의 모든 동적 파티션 테이블 조회
SHOW DYNAMIC PARTITION TABLES;

-- 특정 DB 지정 시
SHOW DYNAMIC PARTITION TABLES FROM 데이터베이스명;
* 주요 출력 항목: `Enable`(활성 상태), `TimeUnit`(단위: DAY/WEEK/MONTH), `Start/End`(생성 범위), `Prefix`(이름 규칙) 등 3. 물리적 파티션 상세 정보 확인 (
SHOW PARTITIONS
)
각 파티션별로 설정된 데이터 범위(Range)나 버킷(Bucket) 개수 등을 확인하고 싶을 때 사용합니다.
Copy code
sql
SHOW PARTITIONS FROM 테이블명;
* 확인할 내용: * Range: 해당 파티션이 커버하는 데이터 범위 * Buckets: 파티션별 태블릿(데이터 분산) 개수 * ReplicationNum: 복제본 개수 요약: * 전반적인 *설정 로직*을 보려면:
SHOW CREATE TABLE
* *동적 생성 규칙*만 모아 보려면:
SHOW DYNAMIC PARTITION TABLES
* *개별 파티션의 범위와 상태*를 보려면:
SHOW PARTITIONS
References • sql-reference/sql-statements/table_bucket_part_index/SHOW_DYNAMIC_PARTITION_TABLES.md • sql-reference/sql-statements/table_bucket_part_index/SHOW_PARTITIONS.md • table_design/data_distribution/dynamic_partitioning.md • sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md References • sql-reference/sql-statements/table_bucket_part_index/SHOW_DYNAMIC_PARTITION_TABLES.md • table_design/data_distribution/dynamic_partitioning.md • sql-reference/sql-statements/table_bucket_part_index/SHOW_PARTITIONS.md
s
@Rocky 파티션 개수의 권장사항이 있어??
r
StarRocks에서 파티션 개수는 시스템 안정성과 쿼리 성능을 결정하는 중요한 요소입니다. 기술적인 상한선과 성능 유지를 위한 권장 수치는 다음과 같습니다. 1. 주요 수치 가이드라인 * 권장 개수: 한 테이블당 *수백 개 ~ 수천 개(약 4,096개 이하)*를 유지하는 것이 가장 이상적입니다. * 기술적 상한: 시스템 설정(
max_partition_number_per_table
)상 *100,000개*까지 가능하지만, 이 수치에 가까워질수록 시스템 부하가 급격히 커집니다. * 데이터 규모: 파티션 하나당 데이터 크기는 *약 100GB 이하*로 유지하는 것을 권장합니다. 2. 너무 많은 파티션이 생성될 때의 문제점 파티션 개수가 과도하게 많아지면(예: 수만 개 이상) 다음과 같은 문제가 발생할 수 있습니다. * FE(Frontend) 부하: 모든 파티션 정보는 FE의 메모리에 메타데이터로 로드됩니다. 파티션이 너무 많으면 FE의 메모리 사용량이 급증하고, 쿼리 계획(Query Planning) 시간이 길어집니다. * BE(Backend) 관리 부담: 각 파티션은 여러 개의 태블릿(Tablet)으로 구성되는데, 파티션이 많아질수록 전체 태블릿 수가 기하급수적으로 늘어납니다. 이는 BE의 파일 핸들러 소모 및 컴팩션(Compaction) 효율 저하로 이어집니다. * 쓰기 증폭: 데이터 로드 시 너무 많은 파티션에 동시에 데이터가 써지면 리소스 소모가 심해집니다. 3. 파티션 설계를 위한 베스트 프랙티스 * 적절한 단위(Granularity) 선택: * 데이터가 아주 많지 않다면
시간(Hour)
단위보다는
일(Day)
단위 파티션이 유리합니다. * 과거 데이터는
월(Month)
단위로 합치는 등 *Mixed Granularity*(v3.4+)를 활용해 전체 개수를 줄일 수 있습니다. * 태블릿 크기 최적화: * 파티션 개수뿐만 아니라 *태블릿(Bucket) 개수*와의 조합이 중요합니다. * 하나의 태블릿(압축 전 원시 데이터 기준) 크기가 100MB ~ 10GB 사이가 되도록 버킷 수를 조절하세요. * 동적 파티션 활용: * `dynamic_partition.start`와
end
설정을 통해 불필요하게 먼 미래나 아주 오래된 과거의 파티션이 미리 생성되어 있지 않도록 관리하세요. 결론적으로, 성능과 관리 편의성을 위해 테이블당 파티션 수를 *4,000개 내외*로 유지하고, 전체 클러스터의 BE 노드당 태블릿 수가 *20만 개*를 넘지 않도록 설계하는 것이 권장됩니다. References • best_practices/partitioning.md • knowledge/usage/best-practice.md • table_design/data_distribution/Data_distribution.md • faq/Deploy_faq.md • best_practices/bucketing.md • best_practices/query_tuning/schema_tuning.md • faq/operation_maintenance_faq.md References • faq/Deploy_faq.md • faq/operation_maintenance_faq.md • table_design/data_distribution/Data_distribution.md • best_practices/primarykey_table.md • best_practices/bucketing.md • knowledge/usage/best-practice.md
s
@Rocky 클러스터 당 파티션 개수는 제한이 있어?
r
StarRocks 클러스터 전체의 총 파티션 개수에 대해 하나의 고정된 수치로 정해진 "하드 리밋(Hard Limit)"은 없습니다. 하지만 시스템의 안정성과 성능을 보장하기 위한 *실질적인 제한 요소*들이 존재합니다. 클러스터 전체 파티션 개수를 결정짓는 핵심 요소 3가지는 다음과 같습니다. 1. FE(Frontend) 메모리 및 메타데이터 관리 * 영향: 모든 파티션과 그 아래의 태블릿(Tablet) 정보는 FE의 메모리에 올라갑니다. * 문제: 클러스터 전체 파티션(및 태블릿) 수가 너무 많아지면 FE의 Java Heap 메모리가 부족해지거나, 체크포인트(Image 생성) 시간이 매우 길어질 수 있습니다. * 권장: 일반적으로 클러스터 전체에서 태블릿 수가 수백만 개 단위를 넘어가기 시작하면 FE 사양 증설이나 최적화가 필요합니다. 2. BE(Backend) 노드당 태블릿 개수 * 파티션은 최소 1개 이상의 버킷(태블릿)으로 구성됩니다. * 권장: BE 노드 하나당 관리하는 *태블릿 개수를 20만 개 ~ 50만 개 이하*로 유지하는 것이 좋습니다. * 이유: 태블릿이 너무 많으면 데이터 관리(Compaction), 디렉토리 스캔, 파일 핸들러 소모 등으로 인해 BE의 CPU와 I/O 부하가 커집니다. 3. 테이블당 설정 제한 (FE 설정값) 클러스터 전체 제한은 없지만, 개별 테이블에 대한 안전장치는 설정되어 있습니다. *
max_partition_number_per_table
: 테이블 하나당 생성 가능한 최대 파티션 수입니다. (기본값: v3.3.2 이상 기준 100,000개) *
max_dynamic_partition_num
: 동적 파티션 설정 시 한 번에 생성 가능한 파티션 수 제한입니다. (기본값: 500개) ────────── 요약 및 가이드라인 구분 | 권장 사항 및 제한 클러스터 전체 | 고정된 제한은 없으나, FE 메모리와 BE 태블릿 수에 비례함 BE 노드당 태블릿 | 약 20만 ~ 50만 개 이하 권장 테이블당 파티션 | 기본 10만 개 (설정 가능하지만 수천 개 내외 권장) 파티션당 데이터 크기 | 약 100GB 이하 (또는 태블릿당 1GB~10GB) 결론적으로, "파티션 개수" 그 자체보다는 그로 인해 파생되는 *"총 태블릿(Tablet) 개수"*가 클러스터의 실제 한계를 결정합니다. 파티션을 너무 잘게 나누기보다는 데이터의 보관 주기(TTL)와 쿼리 성능을 고려하여 적절한 개수를 유지하는 것이 중요합니다. References • faq/Deploy_faq.md • administration/management/FE_configuration.md • faq/operation_maintenance_faq.md • table_design/data_distribution/Data_distribution.md References • faq/Deploy_faq.md • administration/management/FE_configuration.md • faq/operation_maintenance_faq.md • administration/management/BE_configuration.md
s
@Rocky 특정 테이블의 테블릿은 어떻게 확인해
r
특정 테이블에 속한 테블릿(Tablet) 정보를 확인하려면
SHOW TABLET
명령어를 사용합니다. 1. 테이블의 모든 테블릿 확인 테이블에 속한 모든 테블릿의 ID, 위치(Backend ID), 상태, 데이터 크기 등을 볼 수 있습니다.
Copy code
sql
SHOW TABLET FROM 테이블명;
* 주요 출력 항목: * `TabletId`: 테블릿의 고유 ID * `BackendId`: 해당 테블릿(또는 복제본)이 저장된 BE 노드 ID * `State`: 테블릿 상태 (NORMAL이면 정상) * `DataSize`: 테블릿의 데이터 크기 * `RowCount`: 테블릿 내의 행 수 2. 특정 파티션의 테블릿만 확인 파티션이 많은 테이블에서 특정 파티션의 테블릿만 추려보고 싶을 때 사용합니다.
Copy code
sql
SHOW TABLET FROM 테이블명 PARTITION(파티션명);
3. 특정 테블릿의 상세 정보 및 위치 확인 `SHOW TABLET FROM`으로 찾은 특정 `TabletId`를 가지고 더 상세한 정보(어느 DB, 어느 테이블 소속인지 등)를 확인하고 싶을 때 사용합니다.
Copy code
sql
SHOW TABLET 테블릿ID;

-- 예시
SHOW TABLET 12345;
4. 기타 유용한 팁 * 개수 제한 및 정렬: 테블릿이 너무 많을 경우 `LIMIT`이나 `ORDER BY`를 함께 사용할 수 있습니다.
Copy code
sql
    -- 데이터 크기가 큰 순서대로 10개만 보기
    SHOW TABLET FROM 테이블명 ORDER BY DataSize DESC LIMIT 10;
* 가독성 높이기: MySQL 클라이언트에서 보고 있다면 명령어 끝에 `\G`를 붙여 세로 형태로 출력하면 보기 편합니다.
Copy code
sql
    SHOW TABLET FROM 테이블명 LIMIT 1 \G
요약: 테이블 전체 테블릿 현황은 *`SHOW TABLET FROM 테이블명`*으로, 특정 테블릿의 상세 정보는 *`SHOW TABLET 테블릿ID`*로 확인하시면 됩니다. References • sql-reference/sql-statements/table_bucket_part_index/SHOW_TABLET.md • knowledge/admin_and_operation/shared_data_compaction.md • administration/management/BE_configuration.md • sql-reference/sql-statements/table_bucket_part_index/SHOW_PARTITIONS.md References • sql-reference/sql-statements/table_bucket_part_index/SHOW_TABLET.md • knowledge/admin_and_operation/shared_data_compaction.md
s
특정 테이블의 테블릿 개수를 세는 명령어는?
@Rocky 특정 테이블의 테블릿 개수를 세는 명령어는?
r
특정 테이블의 테블릿(Tablet) 개수를 확인하는 방법은 *논리적 개수(버킷 수의 합)*를 원하는지, 아니면 *물리적 개수(복제본 포함 전체)*를 원하는지에 따라 다릅니다. 가장 정확하고 권장되는 방법은
information_schema
시스템 뷰를 사용하는 것입니다. 1. 논리적 테블릿 개수 (Partition별 Buckets의 합) 테이블의 모든 파티션에 설정된 버킷(Buckets) 수를 합산한 수치입니다. (v3.1.9 / v3.2.4 이상 권장)
Copy code
sql
SELECT TABLE_NAME, SUM(BUCKETS) AS total_logical_tablets
FROM information_schema.partitions_meta
WHERE TABLE_NAME = '테이블명' AND DB_NAME = '데이터베이스명'
GROUP BY TABLE_NAME;
2. 물리적 테블릿 개수 (복제본 포함 전체) 클러스터 전체 BE 노드에 실제로 생성되어 있는 테블릿(Replica)의 총합을 구하는 방법입니다.
Copy code
sql
-- 먼저 테이블 ID를 확인합니다.
SELECT TABLE_ID FROM information_schema.tables WHERE TABLE_NAME = '테이블명';

-- 확인된 TABLE_ID를 사용하여 개수를 셉니다.
SELECT COUNT(*) AS total_physical_tablets
FROM information_schema.be_tablets
WHERE TABLE_ID = [위에서확인한_TABLE_ID];
_참고: `REPLICATION_NUM`이 3이라면, 물리적 개수는 논리적 개수의 약 3배가 됩니다._ 3. 간단히 확인하기 (SHOW 명령어) SQL 쿼리를 작성하기 번거롭다면 다음 명령어로 파티션별 버킷 수를 바로 확인할 수 있습니다.
Copy code
sql
SHOW PARTITIONS FROM 테이블명;
* 출력 결과의
Buckets
컬럼 수치들을 더하면 전체 테블릿 개수가 됩니다. 요약 * 쿼리로 한 번에 확인: `information_schema.partitions_meta`에서
SUM(BUCKETS)
수행 * 복제본까지 포함한 전체 관리 현황: `information_schema.be_tablets`에서
COUNT(*)
수행 References • knowledge/admin_and_operation/shared_data_compaction.md • sql-reference/information_schema/be_tablets.md • sql-reference/sql-statements/table_bucket_part_index/SHOW_TABLET.md • administration/management/monitoring/metrics.md • sql-reference/sql-statements/table_bucket_part_index/SHOW_PARTITIONS.md References • sql-reference/information_schema/be_tablets.md • administration/management/monitoring/metrics.md • knowledge/admin_and_operation/shared_data_compaction.md
s
@Rocky starrocks internal catalog에서 ins_dt를 기본값으로 system을 넣을거야 create문에 default구문좀 알려줘
r
StarRocks 내부 카탈로그(Internal Catalog)에서 테이블을 생성할 때,
ins_dt
컬럼에 현재 시스템 시간을 기본값으로 설정하려면
DATETIME
타입과
CURRENT_TIMESTAMP
(또는
now()
) 함수를 사용합니다. 1. 기본 사용법 (DATETIME 타입) 가장 일반적으로 사용하는 방식입니다. 데이터를 명시적으로 넣지 않으면 데이터가 입력되는 시점의 시간이 기록됩니다.
Copy code
sql
CREATE TABLE example_table (
    id BIGINT NOT NULL,
    data VARCHAR(100),
    -- 데이터 입력 시 현재 시간을 기본값으로 설정
    ins_dt DATETIME DEFAULT CURRENT_TIMESTAMP 
)
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id);
2. 정밀도가 필요한 경우 밀리초(ms) 단위까지 저장하고 싶다면 `DATETIME(6)`와 같이 정밀도를 지정할 수 있습니다.
Copy code
sql
CREATE TABLE example_table (
    id BIGINT NOT NULL,
    -- 마이크로초 단위(6자리)까지 포함하는 현재 시간
    ins_dt DATETIME(6) DEFAULT CURRENT_TIMESTAMP(6)
)
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id);
주의사항 및 참고 1. 날짜만 필요한 경우: 시간 없이 날짜만 저장하고 싶다면
DATE
타입을 사용하고 `DEFAULT (curdate())`를 사용합니다. (StarRocks 2.5 버전 이상부터 표현식 기본값 지원)
Copy code
sql
    ins_dt DATE DEFAULT (curdate())
2. 업데이트 시 시간 자동 갱신: StarRocks는 현재 `ON UPDATE CURRENT_TIMESTAMP`와 같은 자동 업데이트 기능은 지원하지 않습니다. 이 값은 *최초 INSERT 시점*의 기록용으로 주로 사용됩니다. 3. 수동 입력: `DEFAULT`가 설정되어 있어도 `INSERT INTO ... VALUES (..., '2023-10-01 100000')`와 같이 명시적으로 값을 넣으면 해당 값이 우선적으로 입력됩니다. 가장 보편적인 *`DATETIME DEFAULT CURRENT_TIMESTAMP`*를 사용하시면 무난하게 시스템 시간을 기록하실 수 있습니다. References • sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md • table_design/data_types/Datetime.md • sql-reference/sql-functions/date-time-functions/now.md • sql-reference/sql-functions/date-time-functions/current_timestamp.md