RonJay
07/20/2026, 11:47 PMRocky
07/20/2026, 11:47 PMuse_page_cache (v3.2.0+): Controls whether a query should use the backend page cache. Default is true.
* skip_page_cache (v3.3.9+): When set to true, the query bypasses the page cache to avoid "polluting" the cache with large, one-time scan data.
* BE Configurations (Memory Limits):
* `storage_page_cache_limit`: Sets the maximum memory size for the storage page cache (e.g., 20G or 20%).
* `disable_storage_page_cache`: Globally enables or disables the page cache.
2. Data Cache (External Storage / Data Lake)
Data Cache accelerates queries on external tables (like HDFS or S3) and consists of a memory layer and a disk layer.
* Session Variables:
* `enable_scan_datacache`: Enables or disables the Data Cache feature for the current session. (Formerly enable_scan_block_cache in versions prior to 3.2).
* populate_datacache_mode (v3.3.2+): Controls how data is cached during a read. Options are auto (default), always, or never.
* skip_local_disk_cache (v3.3.9+): Instructs the backend to bypass the local disk cache for the session.
* BE Configurations (Memory Limits):
* `datacache_mem_size`: Sets the maximum memory limit for Data Cache. This memory is used for the "Page Cache" component of the Data Cache feature.
* `datacache_enable`: The global switch for the Data Cache feature.
3. Query Cache (Result Cache)
Often confused with Page Cache, the Query Cache stores the final results of sub-computations.
* Session Variables:
* `enable_query_cache`: Enables the query result cache.
* query_cache_entry_max_bytes / `query_cache_entry_max_rows`: Thresholds for when to cache or bypass results.
* BE Configuration:
* `query_cache_capacity`: The total memory capacity allocated for the query result cache on each BE (default is 512MB).
Summary Table
Cache Type | Session Toggle | Memory Limit (BE Config)
Local Page Cache | use_page_cache | storage_page_cache_limit
External Data Cache | enable_scan_datacache | datacache_mem_size
Query Result Cache | enable_query_cache | query_cache_capacity
Note: You cannot set the absolute memory size limits (like "10GB") via session variables; these must be configured in the be.conf file or via UPDATE be_configs for dynamic adjustment.
References
• administration/management/BE_configuration.md
• sql-reference/System_variable.md
• administration/management/resource_management/Memory_management.md
• data_source/data_cache.md
• administration/management/monitoring/metrics.md
• using_starrocks/caching/query_cache.mdRonJay
07/22/2026, 9:31 AMRocky
07/22/2026, 9:31 AMdbgen), 테이블 생성(DDL), 데이터 로딩(Stream Load), 쿼리 실행을 자동화하는 스크립트를 제공합니다.
3. 부하 테스트 수행 단계
1. 환경 구성: 테스트 목적에 맞는 BE(Backend)와 FE(Frontend) 노드 수를 구성합니다. (최소 BE 3대 권장)
2. 데이터 생성 및 로딩:
* gen_data 스크립트로 데이터를 생성합니다.
* Stream Load 방식을 사용하여 데이터를 로딩하는 것이 가장 빠르며 권장됩니다.
3. 쿼리 실행:
* Cold Run: 캐시가 없는 상태에서의 첫 실행 속도 측정.
* Hot Run: 캐시(Page Cache 등)가 활성화된 상태에서 3~5회 반복 실행 후 평균값 측정.
4. 동시성 테스트: mysqlslap 또는 `Apache JMeter`와 같은 표준 도구를 사용하여 10, 20, 50개 등 동시 스레드를 늘려가며 QPS와 P99 Latency를 확인합니다.
4. 용량 산정 및 모니터링 가이드 (Tip)
부하 테스트 중 성능 병목을 확인하기 위해 다음을 모니터링해야 합니다:
* CPU 계산식: StarRocks는 코어당 초당 약 1,000만~1억 개의 행을 처리하는 것을 목표로 설계되었습니다.
_ 필요 CPU 코어 수 = (스캔 행 수 / 코어당 처리 행 수) / 목표 응답 시간 _ 예상 QPS
* Grafana 대시보드: StarRocks용 Grafana 템플릿을 사용하여 BE의 CPU 사용률, 메모리(Page Cache), 쿼리 큐 대기 시간 등을 실시간으로 확인하십시오.
* Query Profile: 특정 쿼리가 느리다면 EXPLAIN ANALYZE 명령어나 FE 감사 로그(Audit Log)를 통해 병목 지점을 분석합니다.
5. 테스트 시 주의사항
* 자원 격리: 테스트 환경에서 Resource Group을 사용하여 테스트 쿼리가 다른 작업에 영향을 주지 않도록 설정할 수 있습니다.
* 데이터 스케일: 최소 100GB(SF100) 이상의 데이터를 사용하여 실제 운영 환경과 유사한 부하를 주어야 StarRocks의 분산 처리 성능이 정확히 측정됩니다.
공식 문서의 Benchmarks 섹션에서 상세한 단계별 튜토리얼을 확인할 수 있습니다.
References
• loading/loading_introduction/troubleshooting_loading.md
• administration/management/BE_configuration.md
• faq/resource_isolation_faq.mdRonJay
07/30/2026, 11:20 AMRocky
07/30/2026, 11:20 AMstarrocks_be_pipe_connector_scan_running_tasks 메트릭이 일부 노드에서만 나타나고 나머지 노드에서는 0으로 보이는 현상은 StarRocks의 Pipe 엔진 및 커넥터(External Table/Pipe)의 태스크 스케줄링 방식 때문입니다.
150대의 대규모 클러스터에서 특정 노드만 일을 하고 있는 이유는 크게 다음과 같은 원인으로 압축됩니다.
1. 처리해야 할 파일(또는 태스크) 개수의 부족
StarRocks의 Pipe(또는 COPY INTO, Catalog 기반 외부터블 조회)는 데이터를 여러 개의 Morsel(데이터 조각) 단위로 쪼개어 처리합니다.
* 만약 로딩하거나 쿼리하려는 외부 파일의 개수가 적거나 데이터 크기가 작으면, FE(Frontend)는 이를 150대 전체로 퍼뜨리지 않고 효율성을 위해 *일부 노드에만 할당*합니다.
* 예를 들어, 읽어야 할 파일이 10개뿐이라면 최대 10개의 노드(또는 그 미만)에서만 스캔 태스크가 실행됩니다.
2. 병렬도(Concurrency) 및 스케줄링 설정
StarRocks는 시스템 자원의 과도한 사용을 막기 위해 한 번에 실행되는 스캔 태스크의 수를 제어합니다.
* connector_io_tasks_per_scan_operator: 기본적으로 한 스캔 연산자당 할당되는 I/O 태스크 수가 제한되어 있습니다.
* pipeline_dop (Degree of Parallelism): 쿼리나 로드 시 설정된 병렬도가 낮으면 전체 노드를 골고루 사용하지 않고 일부 노드의 스레드만 점유하게 됩니다.
3. 리소스 그룹(Resource Group) 및 워크로드 격리
만약 Resource Group 기능을 사용하여 특정 Pipe 작업이나 쿼리를 특정 노드군으로 제한했다면, 해당 그룹에 속하지 않은 노드들은 태스크를 받지 않으므로 메트릭이 0으로 표시됩니다.
4. 데이터 Locality (HDFS 등의 경우)
외부 저장소가 HDFS인 경우, StarRocks는 가급적 데이터가 물리적으로 존재하는 노드(DataNode와 BE가 같은 위치일 때)에서 스캔을 수행하려고 시도합니다. 특정 데이터가 일부 노드에 몰려 있다면 해당 노드들 위주로 `running_tasks`가 발생할 수 있습니다. (S3 같은 객체 스토리지의 경우에는 이 영향이 거의 없습니다.)
5. Pipe 객체의 특성 (CREATE PIPE)
만약 `CREATE PIPE`를 통한 지속적 인입 작업을 보고 계신 것이라면:
* Pipe는 내부적으로 Micro-batch 방식으로 작동합니다.
* 큐에 쌓인 파일들을 순차적으로 처리하면서 특정 시점에는 소수의 BE 노드만 선택되어 스캔을 수행하는 스케줄링 알고리즘을 가질 수 있습니다. 150대 노드 전체가 동시에 하나의 인입 작업을 분담하기보다는, 필요한 만큼의 노드만 활성화되는 방식입니다.
──────────
확인해볼 사항
* 파일 개수 확인: 읽어들이는 소스 데이터의 파일 개수가 150개 이상으로 충분히 많은지 확인해 보세요.
* 시스템 변수 확인:
sql
SHOW VARIABLES LIKE '%pipeline_dop%';
SHOW VARIABLES LIKE '%connector_io_tasks_per_scan_operator%';
* Profile 확인: 실행 중인 쿼리나 로드 작업의 *Query Profile*을 확인하면 실제로 어느 노드에 몇 개의 인스턴스가 할당되었는지(Fragment Instance 분포)를 정확히 파악할 수 있습니다.
결론적으로, 데이터 규모나 설정된 병렬도가 150대 전체를 풀가동할 만큼 크지 않다면 일부 노드만 값이 보이는 것은 *StarRocks의 정상적인 리소스 최적화 결과*일 가능성이 매우 높습니다.
References
• sql-reference/System_variable.md
• administration/management/monitoring/metrics.md
• loading/hdfs_load.md
• administration/management/resource_management/Load_balance.md
• administration/management/resource_management/Replica.md
• loading/Kafka-connector-starrocks.md
• knowledge/usage/best-practice.md
• loading/Flink-connector-starrocks.md
• loading/loading_introduction/troubleshooting_loading.md
References
• administration/management/resource_management/Load_balance.md
• loading/Kafka-connector-starrocks.md
• knowledge/usage/best-practice.md
• administration/management/resource_management/Replica.md
• loading/Flink-connector-starrocks.md
• loading/hdfs_load.mdRonJay
07/30/2026, 11:31 AMRocky
07/30/2026, 11:31 AMpipe_connector_scan_running_tasks (실행 중인 태스크)
* 현재 BE(Backend) 노드의 커넥터 전용 스레드 풀에서 실제로 실행 중인 스캔 태스크의 개수입니다.
* 이 값이 높으면 해당 노드가 외부 데이터를 읽어오느라 바쁘게 일하고 있다는 뜻입니다.
* pipe_connector_scan_pending_tasks (대기 중인 태스크)
* BE 노드에 할당은 되었지만, 스레드 풀이 가득 차서 큐에서 대기 중인 태스크의 개수입니다.
* 이 값이 지속적으로 높다면 스캔 성능 병목이 발생하고 있음을 의미하며, BE의 커넥터 스레드 수(connector_io_tasks_per_scan_operator) 설정을 조정해야 할 수도 있습니다.
──────────
2. 왜 150개 노드 중 특정 노드만 값이 보일까?
150대의 대규모 클러스터에서 일부 노드만 일을 하고 나머지가 0인 이유는 크게 세 가지 효율화 전략 때문입니다.
① 데이터 지역성 및 해시 스케줄링 (Data Locality & Hashing)
StarRocks는 Data Cache(데이터 캐시) 효율을 높이기 위해, 특정 파일이나 데이터 블록을 가급적 *이전에 처리했던 노드에 우선 할당*합니다.
* 동일한 외부 파일은 파일 경로의 해시 값을 기반으로 특정 BE 노드들에 고정되어 할당되는 경향이 있습니다.
* 만약 스캔 대상 데이터가 클러스터 전체 노드 수(150대)보다 적은 수의 파일로 구성되어 있다면, 해당 파일들을 담당하는 특정 노드들만 지표가 올라가고 나머지는 0이 됩니다.
② 쿼리 병렬도 (Pipeline DOP) 설정
쿼리 실행 시 설정된 병렬도(pipeline_dop)가 노드 수에 비해 낮을 경우 발생합니다.
* 예를 들어, 150대 노드가 있더라도 쿼리의 총 태스크 조각(Morsels/Splits)이 20개뿐이라면, FE는 이 20개를 150대에 골고루 뿌리기보다 20대의 노드에 집중시켜 네트워크 오버헤드를 줄입니다.
③ 소량의 데이터 인입 (Pipe/Copy Into)
PIPE 객체를 통해 데이터를 지속적으로 가져오는 경우, 한 번에 처리하는 데이터 양(Micro-batch)이 150대 노드를 모두 사용할 만큼 크지 않을 수 있습니다.
* 데이터 인입 작업은 시스템 자원을 효율적으로 쓰기 위해 최소한의 노드만 사용하여 작업을 완료하려는 성질이 있습니다.
요약 및 확인 방법
* 정상 여부: 일부 노드만 값이 찍히더라도 전체적인 쿼리 성능이나 데이터 로딩 속도에 문제가 없다면, 이는 StarRocks가 *캐시 효율과 네트워크 비용을 고려해 지능적으로 태스크를 분배*하고 있는 정상적인 상태입니다.
* 확인 팁: SHOW PROC '/current_queries'; 명령어로 현재 실행 중인 쿼리를 찾은 뒤, *Query Profile*을 확인해 보세요. ScanNode 항목에서 데이터가 특정 노드에 몰려 있는지(Skew), 아니면 태스크 수 자체가 적은 것인지 상세히 확인할 수 있습니다.
References
• administration/management/monitoring/metrics.md
• sql-reference/System_variable.md
• data_source/data_cache.md
• administration/management/resource_management/Load_balance.md
• administration/management/BE_configuration.mdRonJay
07/30/2026, 11:51 AMRocky
07/30/2026, 11:51 AMstarrocks_be_cpu_usage: 각 노드의 CPU 사용률입니다. 특정 노드만 높다면 쿼리 플랜이 특정 노드에 집중되거나 데이터 스큐(Skew)가 있는 것입니다.
* starrocks_be_memory_allocated_bytes: 노드별 메모리 할당량입니다. 대규모 Join이나 집계 작업이 특정 노드에 쏠리는지 확인합니다.
2. 쿼리 실행 및 태스크 분배 (Pipeline Engine)
StarRocks의 파이프라인 엔진이 태스크를 어떻게 배분하는지 보여줍니다.
* starrocks_be_pipeline_executor_running_tasks: 현재 실행 중인 파이프라인 태스크 수입니다. 모든 CN에서 이 숫자가 유사하게 유지되어야 합니다.
* starrocks_be_pipeline_driver_queue_len: 실행을 대기 중인 큐의 길이입니다. 특정 노드에서만 이 값이 높다면 해당 노드가 병목(Straggler)이 되고 있다는 신호입니다.
3. 데이터 스캔 및 I/O 균형 (Connector/External Table)
S3나 HDFS 같은 외부 데이터를 읽을 때의 부하 분산 지표입니다.
* starrocks_be_pipe_connector_scan_running_tasks: 질문하신 지표로, 현재 외부 데이터를 읽고 있는 스캔 태스크 수입니다.
* starrocks_be_query_scan_bytes_total: 노드별로 읽어들인 누적 데이터 양입니다. 150대 노드가 각각 비슷한 양의 바이트를 처리하고 있는지 확인하세요.
4. 데이터 캐시 효율 (Shared-Data 환경 핵심)
CN 환경에서는 로컬 디스크에 외부 데이터를 캐싱합니다. 캐시가 골고루 쌓여야 성능이 균일해집니다.
* starrocks_be_data_cache_read_bytes_total: 캐시에서 읽어온 데이터 양입니다.
* starrocks_be_data_cache_cache_size: 각 노드가 현재 사용 중인 캐시 용량입니다. 특정 노드만 캐시를 많이 쓴다면 데이터 접근 패턴이 편향된 것입니다.
5. 연결 및 네트워크
* starrocks_be_connection_total: FE가 각 CN으로 연결을 골고루 분산하고 있는지 확인합니다.
* starrocks_be_network_send_bytes_total / receive_bytes_total: 노드 간 데이터 셔플링(Shuffle) 시 발생하는 네트워크 부하가 균등한지 측정합니다.
──────────
💡 팁: SQL로 빠르게 확인하기
대시보드 외에 SQL 창에서 전체적인 상태를 요약해서 보고 싶을 때는 다음 명령어를 사용하세요:
sql
-- 모든 CN의 CPU, 메모리, 실행 중인 쿼리 수를 한눈에 확인
SHOW COMPUTE NODES;
이 결과에서 NumRunningQueries, CpuUsedPct, MemUsedPct 컬럼을 비교하여 150개 노드의 수치가 크게 차이 나지 않는지 점검하시면 됩니다.
만약 특정 노드만 계속 일을 한다면?
1. Data Skew: 특정 파티션이나 컬럼 값에 데이터가 몰려 있어 특정 노드가 담당할 분량이 많은 경우.
2. Plan Skew: FE의 옵티마이저가 쿼리 계획을 세울 때 특정 노드 위주로 인스턴스를 할당한 경우 (주로 데이터 소스 파일 수가 적을 때 발생).
References
• administration/management/monitoring/metrics.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_COMPUTE_NODES.md
• administration/http_interface.md
• data_source/data_cache.md
References
• administration/http_interface.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_COMPUTE_NODES.md
• administration/management/monitoring/metrics.mdRonJay
07/30/2026, 2:05 PMRocky
07/30/2026, 2:05 PMmem_limit)을 초과했을 때 발생하며, 구체적으로 어떤 작업을 하다가 한계에 도달했는지를 나타냅니다.
1. read and decompress page
이 에러는 BE가 저장소(디스크 혹은 외부 저장소)에서 데이터를 읽어와 *압축을 해제하고 메모리에 올리는 과정*에서 발생합니다.
* 상황: StarRocks는 데이터를 '페이지(Page)' 단위로 나누어 압축해 저장합니다. 쿼리 실행 시 이 페이지들을 읽어 메모리에서 압축을 풀어야 하는데, 이때 메모리 할당을 시도하다가 BE 전체 메모리 한도에 걸린 것입니다.
* 주요 원인:
* 컬럼이 너무 많은 경우: 한 번에 읽어야 할 컬럼(Wide Column)이 너무 많으면 압축 해제 시 필요한 메모리 양이 급격히 늘어납니다.
* 대량의 Upsert 작업: Primary Key 모델에서 대량의 데이터를 업데이트(Upsert)할 때, 기존 데이터를 확인하기 위해 대량의 페이지를 읽고 해제하는 과정에서 메모리가 튈 수 있습니다.
* 복잡한 데이터 타입: JSON이나 긴 문자열 컬럼이 포함된 페이지를 처리할 때 더 많은 메모리가 소모됩니다.
2. get chunk from scanner
이 에러는 데이터를 스캔하는 'Scanner' 단계에서 읽어들인 데이터를 *'Chunk(연산 단위)'로 변환해 상위 연산자로 넘겨주려는 시점*에 발생합니다.
* 상황: StarRocks의 실행 엔진은 데이터를 'Chunk'라는 단위로 묶어서 처리합니다. Scanner가 디스크에서 읽은 데이터를 이 Chunk 구조로 만들어 메모리에 담아두는데, 이 Chunk들이 차지하는 메모리가 한도를 넘어선 것입니다.
* 주요 원인:
* 높은 스캔 병렬도: 너무 많은 스캔 스레드가 동시에 실행되어 각 스레드가 들고 있는 Chunk들이 메모리를 점유할 때 발생합니다.
* 필터링(Predicate) 효율 저하: 조건절(Where절)에 의해 걸러지는 데이터가 적어 너무 많은 로우가 그대로 Chunk에 담겨 올라올 때 발생합니다.
* Chunk 사이즈 설정: `vector_chunk_size`와 같은 설정에 따라 한 번에 처리하는 데이터 양이 큰데, 이를 처리할 BE 메모리가 부족한 경우입니다.
──────────
해결 및 대응 방법
1. 쿼리 단위 메모리 제한 확인:
특정 쿼리가 너무 많은 메모리를 쓰는 것이라면 exec_mem_limit 세션 변수를 높여줄 수 있지만, 만약 *BE 전체 메모리 한도*(Memory of process exceed limit)에 걸린 것이라면 다음을 확인해야 합니다.
2. BE 메모리 한도(mem_limit) 조정:
서버의 물리 메모리에 여유가 있다면 `be.conf`에서 mem_limit (기본 90%) 값을 확인해 보세요.
3. 불필요한 컬럼 읽기 지양:
SELECT * 보다는 필요한 컬럼만 선택하여 스캔 단계의 메모리 부하를 줄이세요.
4. Primary Key 테이블 최적화:
Upsert 시 메모리가 튄다면 enable_persistent_index 설정을 통해 인덱스가 메모리를 과하게 점유하지 않도록 설정할 수 있습니다.
5. 프로파일 확인:
`get_query_profile`을 통해 어떤 ScanNode에서 메모리를 많이 쓰는지, 데이터 스큐(Skew)가 발생해 특정 노드에만 부하가 쏠린 것은 아닌지 확인이 필요합니다.
요약하자면, *`read and decompress page`*는 데이터를 읽는 *저수준 I/O 단계*의 메모리 부족이고, *`get chunk from scanner`*는 읽은 데이터를 *연산용 데이터 구조(Chunk)로 만드는 단계*의 메모리 부족입니다.
References
• faq/Sql_faq.md
• administration/management/resource_management/Memory_management.md
• administration/management/BE_configuration.md
• knowledge/usage/best-practice.md
• faq/loading/Loading_faq.md
• sql-reference/System_variable.md
• deployment/environment_configurations.md
• administration/management/monitoring/alert.md
• unloading/Flink_connector.md
References
• unloading/Flink_connector.md
• knowledge/usage/best-practice.md
• administration/management/BE_configuration.md
• faq/Sql_faq.md
• faq/loading/Loading_faq.md
• administration/management/resource_management/Memory_management.mdRonJay
07/31/2026, 12:58 AMRocky
07/31/2026, 12:59 AMstarrocks_be_query_scan_pending (또는 pipe_scan_executor_queuing) 수치가 늘어나는 것은 BE 노드의 *데이터 스캔 전용 스레드 풀(Thread Pool)이 포화 상태*에 도달했음을 의미합니다.
즉, 데이터를 읽어오라는 요청(Scan Task)은 계속 들어오는데, 이를 처리할 수 있는 스레드가 부족하여 작업들이 *큐(Queue)에서 대기*하고 있는 상태입니다. 주요 원인은 다음과 같습니다.
1. I/O 병목 및 느린 저장소 (External Storage)
* 원인: S3, HDFS 등 외부 저장소의 응답 속도가 느려지면, 스캔 태스크 하나가 완료되는 시간이 길어집니다.
* 결과: 스레드 풀 내의 스레드들이 작업을 빨리 끝내고 반환되지 못하면서, 뒤따라오는 태스크들이 계속 큐에 쌓이게 됩니다.
2. 과도한 동시 쿼리 (High Concurrency)
* 원인: 한꺼번에 너무 많은 사용자가 조회를 요청하거나, 대량의 병렬 쿼리가 실행될 때 발생합니다.
* 결과: 각 쿼리마다 수많은 스캔 태스크를 생성하는데, 시스템이 정해둔 최대 스레드 수(pipeline_scan_executor_thread_num)를 초과하는 요청이 들어오면 대기 상태로 전환됩니다.
3. "Small File" 문제 (많은 수의 작은 파일)
* 원인: 읽어야 할 파일의 크기는 작지만 개수가 수천~수만 개로 너무 많을 때 발생합니다.
* 결과: 파일 하나를 읽을 때마다 태스크가 생성되는데, 실제 데이터를 읽는 시간보다 파일을 열고 닫는 오버헤드가 커지면서 스레드 풀을 비효율적으로 점유하게 됩니다.
4. 리소스 그룹(Resource Group) 제한
* 원인: 특정 리소스 그룹에 설정된 CPU나 병렬도 제한에 걸린 경우, 해당 그룹의 쿼리가 더 이상 스레드를 점유하지 못하도록 제어될 때 큐잉이 발생할 수 있습니다.
5. CPU 부하 (Heavy Computation)
* 원인: 데이터를 읽어온 후 수행하는 필터링, 압축 해제(Decompress) 등의 작업이 CPU를 많이 소모할 때 발생합니다.
* 결과: I/O 스레드가 데이터를 읽어도 CPU 자원을 할당받지 못해 처리가 지연되면, 전체적인 스캔 회전율이 떨어지며 펜딩이 발생합니다.
──────────
대응 및 확인 방법
1. 쿼리 프로파일 확인:
SHOW PROC '/current_queries'; 명령어로 실행 중인 쿼리의 Profile을 확인하세요. 특정 `ScanNode`에서 `WaitTime`이나 `ScanTime`이 비정상적으로 높은지 체크해야 합니다.
2. 저장소 상태 점검:
외부 테이블 스캔 중이라면 S3/HDFS의 Throttling이나 네트워크 지연이 있는지 확인하세요.
3. 설정 조정 (신중히 결정):
BE의 스레드 수를 조정하여 처리 성능을 높일 수 있습니다. (서버 자원이 여유로울 때 권장)
* `pipeline_scan_executor_thread_num`: 파이프라인 엔진의 스캔 스레드 수 (기본값은 CPU 코어 수에 비례)
4. Data Cache 활용:
반복적인 스캔이 문제라면 StarRocks의 Data Cache 기능을 활성화하여 원격 저장소 I/O 의존도를 낮추는 것이 가장 효과적입니다.
References
• administration/management/monitoring/metrics.md
• administration/management/resource_management/query_queues.md
• administration/management/BE_configuration.md
• data_source/data_cache.md
References
• administration/management/monitoring/metrics.md
• administration/management/resource_management/query_queues.md
• administration/management/monitor_manage_big_queries.md
• faq/Sql_faq.mdRonJay
07/31/2026, 3:57 AMRocky
07/31/2026, 3:57 AMmem_limit (리소스 그룹 전체 제한)
* 대상: 해당 리소스 그룹에 속한 모든 쿼리의 합계 메모리 사용량입니다.
* 단위: 퍼센트(%, 예: `0.2`는 BE 쿼리 메모리 풀의 20% 의미).
* 용도: 특정 업무용(예: 마케팅팀, 개발팀)으로 할당된 전체 리소스 파이를 제한할 때 사용합니다. 그룹 내의 쿼리들이 이 합계를 넘어가면 새로운 쿼리가 대기하거나 기존 쿼리가 실패할 수 있습니다.
2. big_query_mem_limit (개별 쿼리 제한)
* 대상: 해당 리소스 그룹에서 실행되는 *개별 쿼리 하나*가 사용할 수 있는 최대 메모리입니다.
* 단위: 바이트(Byte, 예: `1073741824`는 1GB 의미).
* 특징:
* BE 노드당 기준: 이 제한은 각 BE 노드별로 적용됩니다. (전체 클러스터 합계가 아님에 주의)
* 동작: 쿼리가 실행 중에 설정된 메모리 양을 초과하면 해당 쿼리는 즉시 종료(Terminated)됩니다.
* 용도: 특정 사용자가 실수로 무거운 쿼리를 날려 시스템 전체가 느려지는 것을 방지하는 '가드레일' 역할을 합니다.
──────────
요약 및 권장 설정
쿼리 하나가 너무 많은 메모리를 쓰는 것을 막고 싶다면 다음과 같이 리소스 그룹을 설정하세요.
sql
CREATE RESOURCE GROUP my_group
TO (user='bad_user')
WITH (
"mem_limit" = "0.5", -- 그룹 전체는 BE 메모리의 50%까지 사용 가능
"big_query_mem_limit" = "2147483648" -- 하지만 개별 쿼리 하나는 노드당 2GB를 넘을 수 없음
);
참고: 리소스 그룹 설정 외에도 세션 변수인 `exec_mem_limit`을 통해서도 개별 쿼리 메모리를 제한할 수 있지만, 리소스 그룹을 사용하면 사용자나 데이터베이스 단위로 *강제적인 정책*을 적용하기에 더 적합합니다.
References
• administration/management/resource_management/resource_group.md
• faq/resource_isolation_faq.md
• administration/management/resource_management/Memory_management.md
References
• faq/resource_isolation_faq.md
• administration/management/resource_management/resource_group.mdRonJay
07/31/2026, 4:01 AMRocky
07/31/2026, 4:01 AMmem_limit vs big_query_mem_limit
* big_query_mem_limit (개별 쿼리 제한):
* 해당 리소스 그룹에서 실행되는 *쿼리 하나*가 각 BE(Backend) 노드에서 사용할 수 있는 최대 메모리입니다.
* 쿼리가 실행 중에 이 한도를 넘어서면 "Memory exceed limit of resource group" 에러와 함께 즉시 종료됩니다.
* 용도: 특정 쿼리가 시스템 전체의 메모리를 독점하는 것을 방지하는 가드레일 역할을 합니다.
* mem_limit (그룹 전체 제한):
* 해당 리소스 그룹에 속한 *모든 쿼리들의 메모리 사용량 합계*를 제한합니다. (BE의 전체 쿼리 메모리 풀 대비 비율로 설정)
* 용도: 워크로드 간(예: 실시간 대시보드 vs 배치 분석)의 리소스 간섭을 방지합니다.
──────────
2. `EXPLAIN ANALYZE`에서 노드당 메모리 확인하기
특정 쿼리가 각 BE 노드에서 메모리를 얼마나 썼는지 확인하려면 EXPLAIN ANALYZE 결과(또는 Query Profile)에서 다음 항목들을 확인해야 합니다.
1. QueryPeakMemoryUsagePerNode (전체 요약 섹션):
* 해당 쿼리가 실행된 모든 노드 중, *가장 메모리를 많이 사용한 노드의 피크(Peak) 사용량*을 보여줍니다. `big_query_mem_limit`에 도달했는지 확인할 때 가장 먼저 봐야 할 지표입니다.
2. Top 10 nodes with the highest memory usage (전체 요약 섹션):
* 메모리를 가장 많이 점유한 상위 10개 노드의 리스트와 각각의 사용량을 보여줍니다. 특정 노드에만 부하가 쏠렸는지(Skew) 확인할 수 있습니다.
3. InstancePeakMemoryUsage (Fragment 섹션):
* 더 상세하게 들어가서 각 Fragment나 Instance 단위의 메모리 사용량을 보고 싶을 때 확인합니다. 특정 연산자(Join, Aggregate 등)가 메모리를 많이 쓰는지 파악할 때 유용합니다.
실행 방법 예시:
sql
EXPLAIN ANALYZE SELECT ... ;
결과 텍스트의 상단 Summary 부분에서 QueryPeakMemoryUsagePerNode 항목을 찾아보세요. 예를 들어 이 값이 `2.5GB`인데 `big_query_mem_limit`이 `2GB`로 설정되어 있었다면 해당 쿼리는 종료될 것입니다.
References
• administration/management/resource_management/resource_group.md
• faq/resource_isolation_faq.md
• best_practices/query_tuning/query_profile_operator_metrics.md
• best_practices/query_tuning/query_profile_text_based_analysis.md
• sql-reference/sql-statements/cluster-management/plan_profile/EXPLAIN_ANALYZE.md
References
• best_practices/query_tuning/query_profile_operator_metrics.md
• best_practices/query_tuning/query_profile_text_based_analysis.md
• sql-reference/sql-statements/cluster-management/plan_profile/EXPLAIN.md
• sql-reference/sql-statements/cluster-management/plan_profile/ANALYZE_PROFILE.md
• best_practices/query_tuning/query_profile_overview.mdRonJay
07/31/2026, 4:04 AMRocky
07/31/2026, 4:04 AMsql
-- 1. 커스텀 ID 설정
SET SESSION custom_query_id = 'my_unique_task_001';
-- 2. 쿼리 실행
SELECT * FROM my_table WHERE id = 10;
2. 쿼리 힌트 사용 (SET_VAR)
쿼리 문장 내에 직접 포함시키는 방식입니다. 이 방식은 해당 단일 쿼리에만 즉시 적용되므로 가장 권장되는 방법입니다.
sql
SELECT /*+ SET_VAR(custom_query_id = 'my_unique_task_001') */ *
FROM my_table
WHERE id = 10;
──────────
활용 및 확인 방법
지정한 `custom_query_id`는 다음과 같이 활용할 수 있습니다.
* 진행 중인 쿼리 확인: SHOW PROC '/current_queries' 명령어를 통해 현재 실행 중인 쿼리의 CustomQueryId 컬럼에서 확인할 수 있습니다.
* 쿼리 강제 종료: 일반적인 QueryId 대신 사용자가 지정한 ID로 쿼리를 종료할 수 있습니다.
sql
KILL QUERY 'my_unique_task_001';
* 감사 로그 확인: FE의 fe.audit.log 파일 내 customQueryId 필드에 해당 값이 기록되어 사후 분석이 용이합니다.
주의사항:
* 이 기능은 StarRocks v3.4.0 이상 버전에서만 지원됩니다. 이전 버전을 사용 중이라면 주석(Comment) 등을 활용해 로그에서 수동으로 찾는 방식 외에는 공식적인 ID 바인딩 기능이 없습니다.
References
• sql-reference/System_variable.md
• using_starrocks/running_queries.md
• best_practices/query_tuning/query_hint.md
References
• sql-reference/System_variable.md
• using_starrocks/running_queries.md
• best_practices/query_tuning/query_hint.md
• administration/management/monitor_manage_big_queries.md
• administration/management/resource_management/Query_management.md
Thinking Process:
1. Analyze the User's Request: The user wants to know how to specify a custom query ID when running a query in StarRocks.
2. Verify Information (from previous tool calls):
* Tool call search_starrocks_doc results confirm that a session variable custom_query_id was introduced in v3.4.0.
* It can be set via SET SESSION custom_query_id = 'id';.
_ It can also be set via a query hint: /_+ SET_VAR(custom_query_id = 'id') */.
* It's visible in SHOW PROC '/current_queries', audit logs (customQueryId field), and can be used with KILL QUERY 'id'.
3. Synthesize the Answer:
* State the feature name: custom_query_id.
* Specify the version requirement: v3.4.0+.
* Provide the two main methods: SET SESSION and SET_VAR (query hint).
* Briefly explain the benefits/usage (monitoring, killing queries, audit logs).
4. Format the Response: Use concise, clear Korean as requested by the user's language. Keep it brief.
5. Final Polish (Self-Correction): Ensure no competitor brands are mentioned. Ensure the tone is helpful and direct. (The previous model response was good, I will provide a similar concise version).StarRocks v3.4.0 버전부터 custom_query_id 시스템 변수를 사용하여 쿼리에 사용자 정의 ID를 부여할 수 있습니다. 이를 통해 외부 시스템의 작업 ID를 StarRocks 쿼리와 매핑하여 모니터링하거나 제어하기가 매우 쉬워집니다.
다음은 두 가지 주요 사용 방법입니다.
1. 쿼리 힌트를 사용한 지정 (권장)
쿼리 문장에 직접 힌트를 포함하는 방식입니다. 이 방식은 해당 단일 쿼리에만 적용되므로 가장 깔끔합니다.
sql
SELECT /*+ SET_VAR(custom_query_id = 'my_job_id_001') */
*
FROM your_table
WHERE ...;
2. 세션 변수 설정을 통한 지정
쿼리 실행 전에 현재 세션에서 ID를 설정하는 방식입니다. 설정 후 실행되는 쿼리에 해당 ID가 부여되며, 쿼리가 끝나면 값은 초기화됩니다.
sql
-- 1. 커스텀 ID 설정
SET SESSION custom_query_id = 'my_job_id_001';
-- 2. 쿼리 실행
SELECT * FROM your_table WHERE ...;
──────────
주요 활용 기능
지정한 `custom_query_id`는 다음과 같은 상황에서 유용하게 사용됩니다.Rocky
07/31/2026, 4:04 AMSHOW PROC '/current_queries' 명령어를 실행하면 CustomQueryId 컬럼에서 사용자가 지정한 ID를 확인할 수 있습니다.
* 쿼리 강제 종료: 시스템이 생성한 긴 UUID 대신, 지정한 커스텀 ID로 쿼리를 종료할 수 있습니다.
* KILL QUERY 'my_job_id_001';
* 로그 분석: FE의 감사 로그(fe.audit.log) 내 customQueryId 필드에 해당 값이 기록되어 나중에 특정 작업의 쿼리를 추적하기 쉽습니다.
참고: 이 기능은 *v3.4.0 이상*에서만 지원되므로, 하위 버전을 사용 중이라면 업그레이드가 필요합니다.
레이드가 필요합니다.
References
• sql-reference/System_variable.md
• using_starrocks/running_queries.md
• best_practices/query_tuning/query_hint.md
/query_hint)
References
• best_practices/query_tuning/query_hint.md
• sql-reference/System_variable.mdRonJay
08/02/2026, 7:29 AMRocky
08/02/2026, 7:30 AMforce_rebalance = true 시 예상 결과
작업 부하 | 노드별 CPU/네트워크 부하가 **매우 균등**해짐
데이터 캐시 | 히트율이 **크게 하락**할 가능성이 높음
대규모 클러스터 | 특정 노드 병목(Long-tail) 현상이 제거되어 안정성 향상
쿼리 큐 | 쿼리 완결성이 좋아져 **큐 회전율 향상**에 도움 (단, 캐시 의존도 낮을 때)
추천 전략:
1. 배치성 작업: 캐시 히트보다 전체 노드 자원을 다 써서 빨리 끝내는 게 중요한 *대형 Import나 배치 쿼리*에서는 이 옵션을 `true`로 설정하는 것이 유리합니다.
2. 조회성 작업: 반복적인 조회가 많고 *데이터 캐시 성능이 중요*한 서비스 쿼리에서는 기본값(false)을 유지하여 캐시 히트율을 보호하는 것이 좋습니다.
3. 결론: 대규모 클러스터에서 유독 몇몇 노드만 CPU가 높고 쿼리 프로파일에서 특정 노드의 스캔 시간이 유독 길게 나타난다면, 이 옵션 사용을 적극 검토하십시오.
References
• data_source/data_cache.md
• data_source/catalog/iceberg/iceberg_catalog.md
• administration/management/FE_configuration.md
• administration/management/BE_configuration.md
• best_practices/query_tuning/query_profile_operator_metrics.md
References
• data_source/data_cache_observe.md
• data_source/data_cache.mdRonJay
08/02/2026, 7:31 AMRocky
08/02/2026, 7:31 AMbig_query_mem_limit 역시 동일하게 노드당 제한값으로 작동합니다.
4. 기본값 0의 의미: 만약 `query_mem_limit`이 0으로 설정되어 있다면, 개별 쿼리에 대한 명시적 제한은 없으며 BE 노드 전체의 가용 메모리(mem_limit) 범위 내에서 최대한 사용하게 됩니다.
결론적으로, 대규모 클러스터일수록 개별 노드의 부하 분산이 잘 되어 있다면 `query_mem_limit`에 노드 개수를 곱한 만큼의 막대한 총 메모리 자원을 활용할 수 있습니다.
References
• sql-reference/System_variable.md
• faq/resource_isolation_faq.md
• administration/management/resource_management/Memory_management.md
References
• sql-reference/System_variable.md
• faq/resource_isolation_faq.md
• administration/management/resource_management/Memory_management.md
• administration/management/resource_management/resource_group.md
• administration/management/monitor_manage_big_queries.md
queries)
References
• faq/resource_isolation_faq.md
• sql-reference/System_variable.md
• administration/management/resource_management/resource_group.md
• administration/management/resource_management/Memory_management.mdRonJay
08/03/2026, 6:10 AMRocky
08/03/2026, 6:10 AMget_query_profile() 함수나 관리 콘솔의 프로필 상세 화면에서 다음 지표들을 확인해 보세요.
프로필에서 확인해야 할 핵심 지표
스캔 노드(예: HdfsScanNode 또는 IcebergScanNode)의 상세 항목을 보면 다음과 같은 지표가 나타납니다.
1. DataCacheReadBytes: *캐시 히트*된 데이터의 양입니다. 시스템이 로컬 메모리나 디스크 캐시에서 직접 읽어온 데이터 크기를 나타냅니다.
2. DataCacheWriteBytes: *캐시 미스*가 발생하여 원격 저장소(S3, HDFS 등)에서 읽어와 캐시에 새로 쓴 데이터의 양입니다.
3. BytesRead: 쿼리에서 읽은 *전체 데이터 양*입니다. (일반적으로 DataCacheReadBytes + 원격지에서 직접 읽은 양)
4. DataCacheReadTimer / DataCacheWriteTimer: 캐시에서 데이터를 읽거나 쓰는 데 걸린 시간입니다.
──────────
예시 상황별 분석 방법
* 캐시 히트율이 높은 경우:
* `DataCacheReadBytes`가 전체 `BytesRead`와 거의 일치합니다.
* `DataCacheWriteBytes`가 0이거나 매우 작습니다.
_ _해석: 이미 캐싱된 데이터를 사용하여 쿼리가 매우 빠르게 수행됨.*
* 캐시 히트율이 낮은 경우 (처음 실행하는 쿼리 등):
* DataCacheReadBytes 수치가 작습니다.
* DataCacheWriteBytes 수치가 큽니다. (원격 저장소에서 데이터를 가져와 캐시에 채우는 과정)
_ _해석: 데이터 캐시를 채우는 중이거나, 캐시 공간이 부족해 기존 캐시가 밀려났을 가능성이 있음.*
확인 방법 (SQL)
최근 실행한 쿼리의 프로필 ID를 확인한 뒤 아래 명령어로 상세 내용을 볼 수 있습니다.
sql
-- 1. 최근 실행된 쿼리의 ID 확인
SELECT last_query_id();
-- 2. 해당 쿼리의 프로필 확인 (출력 내용 중 DataCacheReadBytes 검색)
SELECT get_query_profile('사용자_쿼리_ID');
만약 특정 쿼리가 캐시를 타지 않는 것 같다면, 앞서 질문하신 hdfs_backend_selector_force_rebalance 설정이 `true`로 되어 있어 노드 간 작업이 재분산되면서 캐시 로컬리티가 깨진 것인지 함께 체크해 보시는 것이 좋습니다.
References
• data_source/data_cache.md
• data_source/data_cache_observe.md
• using_starrocks/caching/block_cache.md
References
• data_source/data_cache.md
• using_starrocks/caching/block_cache.md
• using_starrocks/caching/query_cache.md
• data_source/data_cache_observe.mdRonJay
08/04/2026, 8:22 AMRocky
08/04/2026, 8:22 AMcn.conf (또는 BE 설정)의 다음 두 파라미터 중 *더 큰 값*을 기준으로 결정됩니다.
* starlet_star_cache_disk_size_percent: 디스크 전체 용량 중 사용할 비율 (기본값: 80)
* datacache_disk_size: 사용할 고정 용량 (예: 500G, 1T. 기본값: 0)
해결 방법:
PVC 용량을 최대한 활용하고 싶다면, `cn.conf`에서 비율을 높이거나 고정 용량을 PVC 크기에 맞춰 명시해야 합니다.
properties
# 예: 디스크의 90%를 캐시로 사용하도록 설정
starlet_star_cache_disk_size_percent = 90
# 또는 PVC 용량이 500GB라면 직접 지정
datacache_disk_size = 450G
주의: 로그 파일, 코어 덤프, 메타데이터 공간을 위해 최소 10% 정도의 여유 공간을 남겨두는 것이 좋습니다.
──────────
2. 권장되는 파일 시스템 (Filesystem)
StarRocks는 고성능 OLAP 처리를 위해 다음과 같은 가이드를 제공합니다.
* 권장 파일 시스템: XFS
* StarRocks는 대용량 파일 처리와 동시 I/O 성능이 뛰어난 *XFS*에서 가장 좋은 성능(QPS 등)을 보입니다.
* 공식 문서에서도 EXT4보다 XFS를 우선적으로 권장합니다.
* 차선책: EXT4
* 사용 가능하지만 XFS에 비해 대규모 동시성 작업 시 성능이 다소 떨어질 수 있습니다.
* 피해야 할 것: EXT3
* 파일 시스템 이슈가 발생할 수 있으므로 권장하지 않습니다.
──────────
3. 추가 팁 (왜 사용량이 변하지 않는가?)
캐시 크기를 설정한 후에도 `du`나 `ls`로 확인하면 실제 데이터양보다 디스크 사용량이 높게 나타날 수 있습니다.
* Peak Usage 유지: 데이터 캐시는 한 번 사용한 공간을 바로 반환하지 않고 "재사용 가능" 상태로 마킹만 합니다. 따라서 디스크 사용량은 *과거 최대치(Peak)*에 머물러 있는 것이 정상적인 동작입니다.
* 교체 정책(LRU): 설정한 한도(80~90%)에 도달하면 가장 오래된 데이터부터 자동으로 밀어내고 새 데이터를 씁니다.
요약
1. 캐시 설정 변경: `starlet_star_cache_disk_size_percent`를 90 정도로 높이거나 `datacache_disk_size`를 직접 지정하세요.
2. 파일 시스템: 반드시 *XFS*를 사용하고, 물리적으로는 NVMe SSD 환경을 권장합니다.
References
• using_starrocks/caching/block_cache.md
• faq/operation_maintenance_faq.md
• administration/management/BE_configuration.md
• data_source/data_cache.md
• data_source/data_cache_troubleshooting.md
troubleshooting)
References
• faq/operation_maintenance_faq.md
• data_source/data_cache_troubleshooting.md
• data_source/data_cache.md
• using_starrocks/caching/block_cache.md
• deployment/shared_data/feature-support-shared-data.mdRonJay
08/04/2026, 8:59 AMRocky
08/04/2026, 8:59 AMNUMBER 컬럼 조회가 되지 않는 문제는, *기존에 생성된 카탈로그가 4.0.4 버전의 메타데이터 캐시(Schema) 정보를 그대로 들고 있기 때문*일 가능성이 매우 높습니다.
4.1.1 버전에서는 Oracle JDBC의 데이터 타입 호환성(특히 NUMBER 타입 매핑 및 정밀도 처리)에 대한 개선 및 변경 사항이 포함되었으나, 업그레이드된 클러스터의 FE(Frontend) 메모리에는 여전히 4.0.4 시절의 잘못된 혹은 구버전 방식의 스키마 정보가 캐싱되어 있어 신규 버전의 쿼리 엔진과 충돌이 발생하는 것입니다.
이 문제를 해결하기 위해 다음 방법들을 시도해 보시기 바랍니다.
1. 메타데이터 강제 새로고침 (가장 권장하는 방법)
해당 테이블 또는 데이터베이스의 메타데이터 캐시를 최신 상태로 갱신하여 4.1.1의 새로운 타입 매핑 로직이 적용되도록 합니다.
sql
-- 특정 테이블의 메타데이터를 새로 고칩니다.
REFRESH EXTERNAL TABLE <oracle_catalog_name>.<db_name>.<table_name>;
-- 또는 해당 데이터베이스 전체를 새로 고칩니다.
-- (StarRocks는 카탈로그 전체 리프레시보다는 테이블 단위 리프레시를 권장합니다.)
2. 카탈로그 속성 확인 및 재설정
4.1 버전부터 Oracle NUMBER 타입 처리를 위해 추가되거나 개선된 속성이 있을 수 있습니다. 만약 1번으로 해결되지 않는다면, 카탈로그 생성 시 사용했던 속성에 아래 옵션을 명시적으로 추가하여 다시 생성(DROP 후 CREATE)해 보시기 바랍니다.
* oracle.number.default-scale: Oracle NUMBER 타입에 명시적인 정밀도(precision)나 스케일(scale)이 없을 때 기본값으로 사용할 값을 지정합니다. (기본값: 6)
3. 왜 신규 클러스터는 잘 되나요?
신규 클러스터는 처음부터 4.1.1의 로직으로 Oracle의 메타데이터를 조회하고 StarRocks 내부 데이터 타입(일반적으로 DECIMAL)으로 매핑하여 캐싱하기 때문에 문제가 발생하지 않습니다. 반면 업그레이드된 클러스터는 과거 버전에서 매핑된 "오래된 스키마 정보"를 유지하고 있어, 쿼리 실행 단계에서 실제 데이터와 메타데이터 간의 불일치가 발생하게 됩니다.
결론적으로, REFRESH EXTERNAL TABLE 명령어를 통해 해당 테이블들의 메타데이터를 4.1.1 기준으로 다시 불러오시면 해결될 것입니다.
References
• data_source/catalog/jdbc_catalog.md
• sql-reference/sql-statements/table_bucket_part_index/REFRESH_EXTERNAL_TABLE.md
• release_notes/release-4.1.md (Release notes highlighting JDBC compatibility improvements)
References
• data_source/catalog/jdbc_catalog.md
• sql-reference/sql-statements/table_bucket_part_index/REFRESH_EXTERNAL_TABLE.md
• data_source/feature-support-data-lake-analytics.md
• data_source/External_table.md
• release_notes/release-3.2.md
-3.2)
References
• data_source/catalog/maxcompute_catalog.md
• data_source/catalog/hive_catalog.md
• data_source/catalog/hudi_catalog.md
• sql-reference/sql-statements/table_bucket_part_index/REFRESH_EXTERNAL_TABLE.mdRonJay
08/04/2026, 9:05 AMRocky
08/04/2026, 9:05 AMNUMBER 타입 처리 방식이 개선되었음에도 불구하고, FE 메모리나 BDB-JE(내부 저장소)에 남아있는 4.0 시절의 메타데이터가 충돌을 일으켜 테이블 이름조차 인식하지 못하는(UNKNOWN TABLE '') 상태가 된 것입니다.
이 문제를 해결하기 위한 단계별 조치 방법은 다음과 같습니다.
1. 카탈로그 삭제 후 재생성 (가장 확실한 해결책)
`SHOW TABLES`조차 되지 않는 상황은 데이터베이스 내의 테이블 목록 메타데이터 자체가 깨진 상태임을 의미합니다. 단순히 테이블 하나를 `REFRESH`하는 것으로는 부족하며, 카탈로그를 삭제하고 다시 생성하여 4.1.1 기준의 메타데이터를 다시 빌드해야 합니다.
sql
-- 1. 기존 카탈로그 삭제
DROP CATALOG <oracle_catalog_name>;
-- 2. 카탈로그 재생성 (기존과 동일한 설정 사용)
CREATE EXTERNAL CATALOG <oracle_catalog_name>
PROPERTIES (
"type" = "jdbc",
"user" = "<username>",
"password" = "<password>",
"jdbc_url" = "jdbc:oracle:thin:@<host>:<port>:<sid>",
"driver_url" = "<driver_path>",
"driver_class" = "oracle.jdbc.driver.OracleDriver"
);
2. Oracle NUMBER 타입 관련 속성 확인
4.1 버전부터는 Oracle의 NUMBER 타입을 더 정확하게 처리하기 위해 정밀도(Precision)와 스케일(Scale)을 다루는 방식이 세분화되었습니다. 카탈로그 생성 시 아래 속성을 명시적으로 추가해 보시기 바랍니다.
* oracle.number.default-scale: Oracle에서 NUMBER 타입에 명시적인 소수점 자릿수가 없을 때 기본값으로 사용할 크기입니다. (기본값: 10)
* 만약 여전히 조회가 안 된다면, 4.1.1에서 도입된 DECIMAL256 관련 호환성을 확인해야 합니다. 매우 큰 NUMBER 타입은 이제 StarRocks의 `DECIMAL128`이나 `DECIMAL256`으로 매핑되는데, 이 과정에서 이전 버전의 스키마와 충돌할 수 있습니다.
3. FE 로그 확인 (원인 파악)
UNKNOWN TABLE '' 에러는 FE가 메타데이터를 역직렬화(Deserialization)하는 과정에서 예외가 발생하여 테이블 이름을 빈 값으로 리턴할 때 주로 발생합니다.
* FE의 fe.warn.log 파일을 확인하여 SHOW TABLES 명령 시 발생하는 *Stack Trace*를 살펴보세요.
* `NullPointerException`이나 `IllegalArgumentException`과 함께 타입 매핑 오류가 찍혀 있다면 메타데이터 불일치가 확실합니다.
요약
1. 현상: 업그레이드 시 이전 버전의 Oracle 메타데이터 구조가 FE에 남아 4.1.1의 개선된 JDBC 엔진과 충돌.
2. 조치: REFRESH 명령어가 먹히지 않는 수준이므로 *`DROP CATALOG` 후 다시 `CREATE CATALOG`*를 수행하여 메타데이터를 완전히 새로 고침하십시오.
3. 주의: 4.1 버전은 이전 버전으로의 다운그레이드가 제한될 정도로 메타데이터 구조 변화가 크므로, 반드시 카탈로그 재생성을 통해 4.1 전용 메타데이터를 생성해야 합니다.
References
• release_notes/release-4.1.md (Release notes highlighting metadata layout changes and JDBC improvements)
• data_source/catalog/jdbc_catalog.md
• sql-reference/sql-statements/table_bucket_part_index/REFRESH_EXTERNAL_TABLE.md
• administration/management/FE_configuration.md