Sangwon
07/07/2026, 5:25 AMRocky
07/07/2026, 5:25 AMenable_sync_publish)
PK 테이블은 데이터 입력 시 Delete+Insert 방식을 사용하며, 데이터 로드 후 "Apply" 단계가 완료되어야 최종 데이터가 확정됩니다.
* 원인: enable_sync_publish 설정이 `false`(비동기)로 되어 있으면, 로드 작업이 '성공'으로 리턴되어도 내부적으로는 아직 PK 인덱스를 업데이트하고 이전 데이터를 삭제 표시(Delete Vector 생성)하는 과정이 진행 중일 수 있습니다. 이 과정에서 쿼리를 치면 시점에 따라 이전 데이터가 포함되거나 제외되어 개수가 달라질 수 있습니다.
* 해결책: FE 설정에서 enable_sync_publish = true (v3.2.0 이상 기본값)로 설정되어 있는지 확인하세요. 이 설정을 켜면 데이터가 실제로 쿼리 가능한 상태(Apply 완료)가 된 후에만 로드 성공을 반환합니다.
2. 동시 로딩(Concurrent Loading) 및 트랜잭션
* 원인: 실시간으로 대량의 데이터가 계속 로드되고 있다면, StarRocks는 MVCC(Multi-Version Concurrency Control)를 사용하므로 매 쿼리 시점마다 최신 버전(Visible Version)이 달라집니다. 특히 다량의 INSERT 혹은 `UPSERT`가 초당 여러 번 발생하는 경우 쿼리할 때마다 개수가 늘어나는 것은 정상적인 동작입니다.
* 확인 방법: SHOW ALTER TABLE MATERIALIZED VIEW 혹은 `SHOW LOAD`를 통해 데이터 로드 주기가 지나치게 빈번하지 않은지, 혹은 로드 완료 시점과 쿼리 시점이 겹치는지 확인해 보세요.
3. 메타데이터 동기화 및 캐시 이슈 (Shared-data 특성)
FE와 CN 조합(공유 저장소 모델)에서는 메타데이터는 FE가 관리하고 데이터는 객체 스토리지(S3 등)에 저장됩니다.
* 원인: 특정 노드(CN)에서 데이터 캐시(Data Cache) 혹은 메타데이터 캐시가 최신 상태로 갱신되는 과정에서 일시적인 불일치가 발생할 가능성이 있습니다. (특히 v3.1 이전 버전에서 PK 테이블을 Shared-data로 사용할 때 드물게 보고된 바 있습니다.)
* 해결책: 현재 사용 중인 StarRocks 버전을 확인해 보세요. v3.1.4 이상 혹은 v3.2 이상의 최신 패치 버전을 사용 중인지 확인하고, 만약 count(_) 결과가 계속 요동친다면 SELECT count(_) FROM table 대신 `SELECT count(pk_column) FROM table`로 쿼리하여 결과가 같은지 비교해 보시기 바랍니다.
추천 조치 사항
1. 동기화 로드 확인: ADMIN SHOW FRONTEND CONFIG LIKE 'enable_sync_publish'; 명령어로 설정값을 확인하고 필요 시 `true`로 변경하세요.
2. 데이터 버전 확인: 쿼리 시 SELECT count(*) FROM table 뒤에 _statistics_ 관련 메타데이터나 `SHOW PROC '/dbs/<db_id>/<table_id>/partitions';`를 통해 `VisibleVersion`이 쿼리할 때마다 올라가고 있는지 확인하세요.
3. 버전 업데이트: 만약 데이터 로드가 없는 상황에서도 개수가 변한다면, 이는 Shared-data 모드 초기 버전의 버그일 가능성이 높으므로 최신 마이너 버전을 적용하는 것을 권장합니다.
만약 위 조치 후에도 현상이 지속된다면, 구체적인 StarRocks 버전과 데이터 로드 방식(Stream Load, Flink Connector 등)을 알려주시면 더 정확한 분석이 가능합니다.
References
• knowledge/admin_and_operation/shared_data_compaction.mdSangwon
07/07/2026, 5:44 AMRocky
07/07/2026, 5:44 AMjson
{
"Status": "Success",
"NumberTotalRows": 100,
"NumberLoadedRows": 100, // Insert와 Update의 합계
"NumberFilteredRows": 0,
"NumberUnselectedRows": 0,
...
}
여기서 `NumberLoadedRows`는 테이블에 최종적으로 반영된 모든 행의 개수입니다.
3. 꼭 확인해야 할 경우의 우회 방법
StarRocks 내에서 로딩 시점에 이를 분리할 수 있는 직접적인 옵션은 현재 없으나, 비즈니스 로직상 구분이 꼭 필요하다면 다음과 같은 방법을 고려할 수 있습니다.
1. 임시 테이블(Staging) 활용: 데이터를 먼저 일반 Duplicate Key 테이블(임시)에 로드한 후, `INSERT INTO ... SELECT`와 `LEFT JOIN`을 사용하여 기존 테이블에 있는 키인지 확인하여 직접 카운트하고 최종 테이블에 넣는 방식입니다. (성능 오버헤드 발생 가능)
2. 애플리케이션/기타 도구 레벨: 데이터를 쏘는 쪽(Flink CDC 등)에서 Source DB의 이벤트를 분석하여 카운트하거나, StarRocks에 넣기 전 미리 체크하는 로직을 두어야 합니다.
3. *`*op` 필드 활용 (Delete 구분은 가능):* 만약 `upsert`가 아니라 명시적으로 `delete`를 수행하는 건수가 궁금하다면, 로드 시 *op 컬럼을 사용하여 삭제 작업을 명시적으로 던질 수 있습니다. 하지만 이 경우에도 결과 JSON에서는 'Loaded'로 합산되어 나옵니다.
요약
StarRocks는 실시간 고속 업데이트를 위해 PK 인덱스 기반의 *UPSERT*를 단일 흐름으로 처리하므로, 표준 Stream Load 응답값만으로는 신규 삽입(Insert)과 기존 수정(Update)을 구분할 수 없습니다.
References
• sql-reference/sql-statements/loading_unloading/STREAM_LOAD.md
• loading/Load_to_Primary_Key_tables.md
• table_design/table_types/primary_key_table.md
References
• loading/Load_to_Primary_Key_tables.md
• sql-reference/sql-statements/table_bucket_part_index/auto_increment.md
• table_design/table_types/primary_key_table.mdRonJay
07/07/2026, 9:49 AMRocky
07/07/2026, 9:50 AMmeta/image 파일이 생성된 지 오래되었고, meta/bdb 아래의 로그 파일 개수가 많을수록 리플레이 시간이 선형적으로 증가합니다.
3. 통계 정보(Statistics) 수집 로그
외부 테이블에 대해 `ANALYZE`를 수행했거나 자동 통계 수집이 활성화된 경우, 통계 관련 메타데이터 로그가 생성됩니다.
* 원인: FE는 시작 시 최신 통계 정보를 메모리에 올리는데, 외부 테이블의 경우 리플레이 도중 캐시를 갱신하려고 시도하며 이 과정에서 네트워크 IO가 발생하여 지연을 유발합니다.
──────────
해결 및 조치 방안
1. 메타데이터 이미지 강제 생성 (Checkpoint):
정상 작동 중일 때 아래 명령어를 통해 최신 상태를 image 파일로 저장하세요. 이렇게 하면 다음 재부팅 시 리플레이해야 할 로그 양이 최소화됩니다.
sql
ALTER SYSTEM CREATE IMAGE;
명령어 실행 후 meta/image 디렉토리에 새로운 이미지가 생성되었는지 확인하세요.
2. 외부 시스템 연결성 확인:
FE 서버에서 Hive Metastore(HMS)나 데이터 소스(S3/HDFS)로의 네트워크 지연이 없는지 확인하세요. 외부 시스템이 느리면 FE 리플레이도 같이 느려집니다.
3. 불필요한 외부 통계 수집 제한:
외부 테이블의 파티션이 너무 많다면, 자동 통계 수집 범위를 조정하거나 필요한 컬럼에 대해서만 수집하도록 설정하여 메타데이터 부하를 줄여야 합니다.
4. StarRocks 버전 업데이트:
리플레이 도중 외부 시스템 호출로 인해 블로킹되는 문제는 성능 저하뿐 아니라 시스템 안정성에도 영향을 미치므로, 해당 버그가 수정된 최신 패치 버전(v3.1.x, v3.2.x 이후의 최신 릴리스)으로 업데이트하는 것을 권장합니다.
추가 확인 사항:
만약 리플레이 도중 FE 로그(fe.log 또는 fe.warn.log)에 MetadataMgr.getTable 혹은 HMS 관련 타임아웃/지연 로그가 찍히고 있다면, 1번 원인(블로킹 문제)일 확률이 매우 높습니다. 이 경우 FE 설정을 통해 외부 메타데이터 캐시 관련 옵션을 튜닝해야 할 수도 있습니다.RonJay
07/07/2026, 10:09 AMRocky
07/07/2026, 10:09 AMreplayer 스레드)*로 동작하므로, 쿼리 실행 시 사용하는 스레드 풀 크기를 늘려도 리플레이 자체는 빨라지지 않습니다.
2. 리플레이가 느린 실제 원인 (External Catalog MV 기준)
사용자님이 질문하신 "External Catalog 기반 MV"의 리플레이가 느린 이유는 주로 외부 시스템과의 통신 블로킹 때문입니다.
* 외부 메타데이터 조회: FE가 MV 정보를 복구할 때, MV가 참조하는 외부 테이블(Hive, Iceberg 등)의 파티션 정보나 통계 정보를 확인하기 위해 외부 카탈로그(HMS, S3 등)에 접근하는 경우가 있습니다.
* 네트워크 I/O 대기: 만약 리플레이 도중에 외부 시스템 응답이 늦어지면, 단일 스레드인 리플레이 스레드가 해당 응답을 받을 때까지 멈춰 있게(Blocking) 됩니다. 이로 인해 수천 개의 MV가 있다면 부팅 시간이 기하급수적으로 늘어납니다.
3. 실제로 리플레이 속도를 줄이는 방법
리플레이 시간을 단축하려면 아래 설정과 조치들을 검토해야 합니다.
1. enable_materialized_view_concurrent_prepare (v3.4.4+):
최신 버전에서는 MV 준비 과정을 병렬로 처리하여 성능을 개선하는 옵션이 추가되었습니다. 이 기능이 활성화되어 있는지 확인해 보세요.
2. 최신 이미지 생성 (CheckPoint):
리플레이할 로그 양 자체가 많으면 느려집니다. 부팅 전 혹은 주기적으로 `ALTER SYSTEM CREATE IMAGE;`를 실행하여 현재 메타데이터 상태를 이미지 파일로 굳히면, 다음 부팅 시 리플레이해야 할 로그가 줄어듭니다.
3. 통계 정보 리플레이 최적화:
최신 패치 버전(v3.1.x, v3.2.x 후기 버전)들에는 리플레이 도중 외부 통계 정보를 수집하며 블로킹되는 현상을 개선하는 로직이 포함되어 있습니다. 버전이 낮다면 업데이트를 권장합니다.
4. 외부 카탈로그 캐시 설정:
background_refresh_metadata_interval_millis 등을 통해 외부 메타데이터를 주기적으로 캐싱하여, FE가 기동 시 외부 시스템에 직접 물어보는 횟수를 줄여야 합니다.
요약
* `mv_plan_cache_thread_pool_size`: 쿼리 실행(Rewrite) 시의 성능 옵션이며, 부팅 속도와는 무관함.
* 느린 원인: 리플레이 스레드가 외부 카탈로그(HMS 등)의 응답을 기다리며 멈추기 때문.
* 해결 방안: `ALTER SYSTEM CREATE IMAGE`로 로그 양 축소, StarRocks 최신 패치 버전으로 업데이트, 혹은 외부 메타데이터 통신 지연 확인.
References
• administration/management/FE_configuration.md
• using_starrocks/async_mv/use_cases/data_lake_query_acceleration_with_materialized_views.md
• knowledge/trouble_shooting/fe_deadlock_problems.md
References
• administration/management/FE_configuration.md
• knowledge/trouble_shooting/fe_memory_problems.md
• knowledge/trouble_shooting/fe_deadlock_problems.mdRonJay
07/07/2026, 12:31 PMRocky
07/07/2026, 12:32 PMenable_profile 설정은 StarRocks에서 쿼리 실행의 상세 내역(Profile)을 수집할지 여부를 결정하는 옵션입니다. 이 설정을 `true`로 변경했을 때의 변화와 장단점은 다음과 같습니다.
1. 변경되는 점 및 효과
* 상세 실행 로그 수집: 쿼리가 실행되는 동안 각 BE(Backend)에서 발생하는 CPU 사용량, 메모리 점유, 스캔 데이터 양, 네트워크 전송 시간 등 모든 연산(Operator) 단위의 지표를 수집합니다.
* 시각화 및 분석 가능: 수집된 데이터는 FE의 웹 UI(http://<FE_IP>:8030/query)에서 확인하거나, get_query_profile(query_id) 함수를 통해 텍스트 형태로 뽑아볼 수 있습니다.
* 쿼리 튜닝의 핵심: 어떤 부분에서 병목(Bottleneck)이 발생하는지, 데이터 왜곡(Skew)이 있는지, 인덱스가 제대로 작동하는지를 정확히 파악할 수 있게 됩니다.
2. 성능상의 디메리트 (부작용)
이 설정은 분석에는 매우 유용하지만, 운영 환경(Production)에서 전역(Global)으로 상시 켜두기에는 다음과 같은 부담이 있습니다.
* FE의 부하 증가: 쿼리가 끝날 때마다 FE는 각 BE에 분산된 수많은 실행 지표를 하나로 모아서 정리(Merge)하고 메모리에 저장해야 합니다. 쿼리 복잡도가 높을수록 FE의 CPU와 메모리 사용량이 늘어납니다.
* 쿼리 응답 속도 지연 (Latency): 실제 연산은 끝났더라도 FE가 프로파일 데이터를 수집하고 처리하는 시간이 추가되므로, 클라이언트가 느끼는 최종 쿼리 응답 시간이 약간 길어질 수 있습니다.
* 동시성 저하: 초당 수백~수천 건의 짧은 쿼리가 발생하는 고대역폭(High Concurrency) 환경에서는 프로파일 수집 자체가 시스템 전체의 병목이 될 수 있습니다.
3. 권장 사용법
성능 저하를 최소화하면서 효과를 보려면 다음과 같이 사용하는 것이 좋습니다.
1. 세션 단위 설정 (권장): 전역으로 켜지 말고, 분석이 필요한 특정 쿼리를 실행할 때만 해당 세션에서 활성화합니다.
sql
SET enable_profile = true;
-- 분석할 쿼리 실행
SELECT ... ;
SET enable_profile = false;
2. 느린 쿼리만 자동 수집: 모든 쿼리가 아니라 특정 시간 이상 걸리는 쿼리에 대해서만 프로파일을 남기고 싶다면, 전역 설정 대신 *`query_detail_limit`*이나 관련 모니터링 설정을 통해 관리하는 것이 효율적입니다.
3. 운영 환경 유의사항: 운영 중인 클러스터에서 전역(SET GLOBAL)으로 켤 경우, 반드시 FE의 메모리 사용량과 CPU 상태를 모니터링하며 진행해야 합니다.
요약
* 효과: "왜 느린지"를 완벽하게 파악할 수 있는 상세 보고서를 제공함.
* 디메리트: FE의 자원(CPU/MEM) 소모가 발생하며, 특히 쿼리 건수가 많을 때 성능 저하가 뚜렷함.
* 결론: 상시 활성화보다는 *필요한 시점에 세션 단위로 사용*하는 것이 가장 안전합니다.
References
• administration/management/FE_configuration.md
• administration/Query_planning_statistics.md
• administration/Query_profile.md
References
• administration/Query_profile.md
• administration/management/FE_configuration.md
• administration/Query_planning_statistics.mdRonJay
07/08/2026, 1:11 AMRocky
07/08/2026, 1:11 AMimage 파일로 저장하도록 강제합니다.
sql
ALTER SYSTEM CREATE IMAGE;
2. 진행 상황 확인 (FE 로그 모니터링)
위 명령어는 *비동기(Asynchronous)*로 동작합니다. 실제 진행 여부는 Leader FE의 fe.log 파일에서 확인할 수 있습니다.
* 시작 로그: triggering a new checkpoint manually... 또는 begin to generate new image: image.xxxx
* 완료 로그: finished save image.xxxx 또는 checkpoint finished save image.xxxx
3. 메타데이터 디렉토리 확인
FE의 메타데이터 경로(기본값: meta 디렉토리)에서 파일이 생성되었는지 확인합니다.
* 경로: meta/image/
* 결과: 명령이 성공하면 image.<버전번호> 파일이 새롭게 생성되어 있어야 합니다.
4. BDB Log (.jdb) 파일의 삭제 원리
`CREATE IMAGE`를 수행한다고 해서 meta/bdb/ 아래의 .jdb 파일들이 즉시 삭제되지는 않습니다.
1. image 파일이 성공적으로 생성되면, 해당 시점 이전의 로그들은 더 이상 부팅 시 리플레이할 필요가 없어집니다.
2. Berkeley DB JE(BDB) 내부의 *Cleaner 스레드*가 백그라운드에서 더 이상 참조되지 않는 .jdb 파일들을 감지하고 일정 시간 후에 점진적으로 삭제합니다.
3. 만약 로그가 계속 삭제되지 않는다면, FE 설정 중 `edit_log_roll_num`(기본 50,000)이 너무 크게 잡혀 있거나 Checkpoint 과정에서 에러가 발생했는지 확인해야 합니다.
주의사항
* 이 작업은 반드시 *Leader FE*에서 트리거되어야 하며, 데이터 양에 따라 image 파일 생성 중 FE의 CPU/IO 사용량이 일시적으로 상승할 수 있습니다.
* 만약 show proc '/frontends'; 명령에서 특정 FE의 Join 상태가 `false`이거나 메타데이터 버전이 크게 차이 난다면, Checkpoint 이전에 네트워크 상태나 FE 클러스터 상태를 먼저 점검하십시오.
References
• sql-reference/sql-statements/cluster-management/nodes_processes/ALTER_SYSTEM.md
• administration/management/monitoring/alert.md
• administration/management/FE_configuration.md
References
• sql-reference/sql-statements/cluster-management/nodes_processes/ALTER_SYSTEM.md
• administration/management/monitoring/alert.md
• administration/management/FE_configuration.md
References
• sql-reference/sql-statements/cluster-management/nodes_processes/ALTER_SYSTEM.md
• administration/management/FE_configuration.md
• administration/management/monitoring/alert.md
• sql-reference/sql-statements/backup_restore/CREATE_REPOSITORY.mdRonJay
07/08/2026, 1:24 AMRocky
07/08/2026, 1:24 AMALTER SYSTEM CREATE IMAGE; 명령을 통해 최근에 메타데이터 스냅샷을 생성했다면, 읽어야 할 Edit Log 양이 거의 없으므로 부팅 즉시 MV 정보가 로드됩니다.
3. 최신 버전의 병렬 최적화 옵션 사용:
* enable_materialized_view_concurrent_prepare (v3.4.4+): 이 설정이 `true`일 경우, MV 준비 과정을 병렬로 처리하여 이전 버전보다 훨씬 빠르게 로딩을 마칩니다.
* enable_mv_post_image_reload_cache (v3.5.0+): 이미지 로드 후 중복된 MV 상태 체크를 최적화하여 시간을 단축합니다.
──────────
3. 로딩 시간을 단축하기 위한 권장 조치
* 정기적인 이미지 생성: 재기동 전이나 주기적으로 `ALTER SYSTEM CREATE IMAGE;`를 실행하여 로그를 압축하세요.
* 버전 업그레이드: MV 로딩 성능 개선은 최신 버전(v3.3, v3.4 이상)에서 집중적으로 이루어졌습니다. 특히 v3.4.4 이상의 병렬 준비(Concurrent Prepare) 기능을 활용하는 것이 좋습니다.
* 외부 카탈로그 캐싱: 외부 카탈로그 관련 MV가 많다면 background_refresh_metadata_interval_millis 등을 설정하여 메타데이터를 미리 캐싱해 두면 부팅 시 외부 통신 부담을 줄일 수 있습니다.
* 비정상 부팅 시 긴급 조치: 만약 MV 오류로 부팅 자체가 안 될 정도로 느리다면, ignore_materialized_view_error = true 설정을 FE 설정 파일에 추가하여 예외를 무시하고 부팅하게 할 수 있습니다.
References
• administration/management/FE_configuration.md
• using_starrocks/async_mv/use_cases/data_lake_query_acceleration_with_materialized_views.md
• using_starrocks/async_mv/troubleshooting_asynchronous_materialized_views.md
• sql-reference/sql-statements/cluster-management/nodes_processes/ALTER_SYSTEM.md
References
• administration/management/FE_configuration.md
• using_starrocks/async_mv/use_cases/data_lake_query_acceleration_with_materialized_views.md