소개
알림도 materialized view의 이점을 얻을 수 있으며, 이를 자동으로 활용합니다.
이렇게 하면 많은 알림을 실행할 때 발생하는 계산 오버헤드를 줄일 수 있으며, 특히 알림은 일반적으로 매우 자주 실행되므로 더욱 효과적입니다.
실행 시간을 줄이면 응답성과 리소스 활용 측면 모두에서 도움이 될 수 있습니다.
증분형 materialized view란 무엇입니까
SELECT 쿼리를 훨씬 더 빠르게 실행할 수 있습니다.
Postgres와 같은 트랜잭션 데이터베이스와 달리 ClickHouse의 materialized view는 저장된 스냅샷이 아닙니다. 대신 원본 테이블에 데이터가 삽입될 때마다 데이터 블록에 대해 쿼리를 실행하는 트리거처럼 동작합니다. 이 쿼리의 결과는 별도의 대상 테이블에 기록됩니다. 데이터가 계속 삽입되면 새로운 부분 결과가 대상 테이블에 추가되고 머지됩니다. 이렇게 머지된 결과는 전체 원본 데이터셋에 대해 집계를 수행한 결과와 동일합니다.
materialized view를 사용하는 주된 이유는 대상 테이블에 기록되는 데이터가 집계, 필터링 또는 변환 결과이기 때문입니다. ClickStack에서는 이를 집계에만 사용합니다. 이러한 결과는 일반적으로 원시 입력 데이터보다 훨씬 작고, 대개 부분 집계 상태로 표현됩니다. 또한 사전 집계된 대상 테이블은 쿼리하기도 단순하므로, 쿼리 시점에 원시 데이터에 대해 동일한 계산을 수행하는 경우보다 쿼리 지연 시간이 크게 줄어듭니다.
ClickHouse의 materialized view는 데이터가 원본 테이블로 들어오는 동안 지속적으로 업데이트되며, 항상 최신 상태를 유지하는 인덱스처럼 동작합니다. 이는 많은 다른 데이터베이스의 materialized view와 다릅니다. 다른 데이터베이스에서는 materialized view가 정적인 스냅샷이며, ClickHouse의 갱신 가능 구체화 뷰처럼 주기적으로 갱신해야 합니다.
증분형 materialized view는 새 데이터가 들어올 때 뷰의 변경분만 계산하므로 계산을 삽입 시점으로 넘깁니다. ClickHouse는 수집에 매우 최적화되어 있으므로, 삽입되는 각 블록에 대해 뷰를 유지하는 데 드는 추가 비용은 쿼리 실행 시 얻는 절감 효과에 비해 작습니다. 집계 계산 비용은 매번 읽을 때마다 반복해서 지불하는 대신 여러 삽입 작업에 걸쳐 분산됩니다. 따라서 사전 집계된 결과를 쿼리하는 것은 이를 다시 계산하는 것보다 훨씬 비용 효율적이며, 그 결과 운영 비용을 낮추고 페타바이트 규모에서도 다운스트림 시각화에 거의 실시간 성능을 제공합니다.
이 모델은 업데이트가 있을 때마다 전체 뷰를 다시 계산하거나 예약된 갱신에 의존하는 시스템과는 근본적으로 다릅니다. materialized view의 동작 방식과 생성 방법에 관한 자세한 설명은 위에서 연결한 가이드를 참조하십시오.
각 materialized view는 삽입 시점에 추가 오버헤드를 발생시키므로, 신중하게 선택해 사용해야 합니다.
단일 materialized view로 서로 다른 그룹화에 대한 여러 메트릭을 계산할 수 있습니다. 예를 들어 1분 버킷 단위로 서비스 이름별 최소값, 최대값, p95 duration을 계산할 수 있습니다. 이렇게 하면 하나의 뷰로 하나의 시각화만이 아니라 여러 시각화를 지원할 수 있습니다. 따라서 각 뷰의 가치를 극대화하고 대시보드와 워크플로 전반에서 재사용되도록 하려면 메트릭을 공유 뷰로 통합하는 것이 중요합니다.
가속할 시각화 선택
높은 효과가 기대되는 시각화 식별
- 자주 갱신되고 계속 표시되는 dashboard 시각화로, 예를 들어 벽면 디스플레이에 상시 표시되는 상위 수준의 모니터링 dashboard가 여기에 해당합니다.
- 런북에서 사용하는 진단 워크플로로, 장애 대응 중 특정 chart를 반복적으로 확인해야 하며 결과도 신속하게 반환되어야 합니다.
- 다음을 포함한 HyperDX의 핵심 사용 경험:
- 검색 페이지의 히스토그램 보기
- APM, Services 또는 Kubernetes 보기와 같은 사전 설정 dashboard에서 사용하는 시각화
이점과 삽입 시점 비용의 균형 맞추기
프로덕션으로 전환하기 전에 항상 materialized view로 인해 추가되는 리소스 오버헤드, 특히 CPU 사용량, 디스크 I/O, 머지 활동을 검증하십시오. 각 materialized view는 삽입 시점의 작업량을 늘리고 추가 파트를 생성하므로, 머지가 이를 따라갈 수 있고 파트 수가 안정적으로 유지되는지 확인하는 것이 중요합니다. 이는 오픈소스 ClickHouse의 시스템 테이블 및 내장 관측성 대시보드, 또는 ClickHouse Cloud의 내장 메트릭 및 모니터링 대시보드를 통해 모니터링할 수 있습니다. 과도한 파트 수를 진단하고 완화하는 방법은 Too many parts를 참조하십시오.
toStartOfMinute와 같은 함수를 사용해 시간 인터벌별로 데이터를 그룹화해야 합니다. 하지만 많은 시각화는 서비스 이름, 스팬 이름, 상태 코드와 같은 추가 그룹화 키도 공통으로 사용합니다. 여러 시각화가 동일한 그룹화 차원을 사용하는 경우, 대개 하나의 materialized view로 처리할 수 있습니다.
예를 들어 (트레이스의 경우):
- 시간에 따른 서비스 이름별 평균 Duration -
SELECT avg(Duration), toStartOfMinute(Timestamp) as time, ServiceName FROM otel_traces GROUP BY ServiceName, time - 시간에 따른 서비스 이름별 요청 수 -
SELECT count() count, toStartOfMinute(Timestamp) as time, ServiceName FROM otel_traces GROUP BY ServiceName, time - 시간에 따른 상태 코드별 평균 Duration -
SELECT avg(Duration), toStartOfMinute(Timestamp) as time, StatusCode FROM otel_traces GROUP BY StatusCode, time - 시간에 따른 상태 코드별 요청 수 -
SELECT count() count, toStartOfMinute(Timestamp) as time, StatusCode FROM otel_traces GROUP BY StatusCode, time
구체화된 뷰 만들기
HyperDX에서 특정 구성 요소에 디버그 패널이 없는 경우, 브라우저 콘솔을 확인하면 됩니다. 모든 쿼리는 그곳에 기록됩니다.
AggregatingMergeTree에 대한 자세한 설명과 예시를 제공합니다.
아래 영상에서 AggregatingMergeTree와 집계 함수를 사용하는 예시를 확인할 수 있습니다.
예시 materialized view
otel_traces_1m을 생성하십시오:
otel_traces_1m_mv - 정의에서는 새 데이터가 삽입될 때 이러한 상태를 계산해 기록합니다:
- 중간 결과를 저장하는 데 사용되는 스키마와 집계 상태 타입을 정의하는 대상 테이블입니다. 이러한 상태가 백그라운드에서 올바르게 머지되도록 하려면 AggregatingMergeTree 엔진이 필요합니다.
- materialized view 쿼리는 삽입 시 자동으로 실행됩니다. 원본 쿼리와 비교하면 최종 집계 함수 대신
avgState,quantilesState와 같은 상태 함수를 사용합니다.
ClickStack에서 materialized view 사용하기
사용을 위해 materialized view 등록하기
소스 편집
HyperDX에서 해당 소스로 이동한 다음 구성 편집 대화상자를 여십시오. materialized view 섹션까지 스크롤하십시오.materialized view 추가
Add materialized view를 선택한 다음, materialized view를 구성하는 데이터베이스와 대상 테이블을 선택하십시오.메트릭 선택
대부분의 경우 timestamp, 차원, 메트릭 컬럼은 자동으로 추론됩니다. 그렇지 않으면 수동으로 지정하십시오.메트릭의 경우 다음을 매핑해야 합니다:- 원래 컬럼 이름(예:
Duration) - materialized view의 해당 집계 컬럼(예:
avg__Duration)
시간 세분화 수준 선택
materialized view의 시간 세분화 수준을 선택하십시오(예: 1분).최소 날짜 선택
materialized view에 데이터가 포함된 최소 날짜를 지정하십시오. 이는 뷰에서 사용할 수 있는 가장 이른 timestamp를 의미하며, 수집이 계속 이루어졌다면 일반적으로 뷰가 생성된 시점입니다.materialized view는 생성 시 자동으로 백필되지 않으므로, 생성 후에 삽입된 데이터에서 생성된 행만 포함합니다.
materialized view 백필에 대한 전체 가이드는 “데이터 백필”에서 확인할 수 있습니다.
소스 저장
소스 구성을 저장하십시오.대시보드 및 시각화에서 가속 적용 여부 확인하기
ClickStack는 materialized view의 최소 timestamp가 쿼리 시간 범위 시작 시점보다 작거나 같을 때만 해당 materialized view를 사용합니다. 이렇게 해야 view에 필요한 데이터가 모두 포함된다고 보장할 수 있습니다. 쿼리는 내부적으로 시간 기반 서브쿼리로 분할되지만, materialized view는 전체 쿼리에 적용되거나 아예 적용되지 않습니다. 향후 개선을 통해 적용 가능한 서브쿼리에만 view를 선택적으로 사용할 수 있게 될 수 있습니다.
- 최적화 상태 확인 대시보드 또는 시각화를 볼 때 번개 모양 또는
Accelerated아이콘을 찾으십시오:
- 초록색 번개는 쿼리가 materialized view로 가속되고 있음을 나타냅니다.
- 주황색 번개는 쿼리가 원본 테이블에서 실행되고 있음을 나타냅니다.
- 최적화 세부 정보 확인 번개 아이콘을 클릭하면 다음 정보가 표시되는 세부 정보 패널이 열립니다:
- 활성 materialized view: 쿼리에 선택된 view와 해당 view의 예상 행 수
- 건너뛴 materialized view: 호환되지만 선택되지 않은 view와 해당 view의 예상 스캔 크기
- 호환되지 않는 materialized view: 사용할 수 없었던 view와 그 구체적인 이유
- 일반적인 비호환 사유 이해 다음과 같은 경우 materialized view가 사용되지 않을 수 있습니다:
- 쿼리 시간 범위의 시작 시점이 view의 최소 timestamp보다 이전인 경우
- 시각화 세분화 수준이 view의 세분화 수준의 배수가 아닌 경우
- 쿼리에서 요청한 집계 함수가 view에 없는 경우
- 쿼리가
count(if(...))와 같은 사용자 지정 count 표현식을 사용해 view의 집계 상태에서 이를 도출할 수 없는 경우
시각화에 사용할 materialized view를 선택하는 방법
EXPLAIN ESTIMATE 메커니즘을 사용해 가장 효율적인 옵션을 자동으로 평가하고 선택합니다.
선택 과정은 다음과 같은 명확한 순서로 진행됩니다:
-
호환성 검증
ClickStack은 먼저 다음 항목을 확인해 materialized view를 해당 쿼리에 사용할 수 있는지 판단합니다:
- 시간 범위 충족 여부: 쿼리의 시간 범위가 materialized view에서 사용할 수 있는 데이터 범위 안에 완전히 포함되어야 합니다.
- 세분화 수준: 시각화의 시간 버킷은 view의 세분화 수준과 같거나 더 거칠어야 합니다.
- 집계: 요청된 메트릭이 view에 있어야 하며, 해당 집계 상태로부터 계산할 수 있어야 합니다.
-
쿼리 변환
호환되는 view에 대해 ClickStack은 materialized view의 테이블을 대상으로 하도록 쿼리를 재작성합니다:
- 집계 함수는 해당 materialized 컬럼에 매핑됩니다.
- 집계 상태에는
-Mergecombinator가 적용됩니다. - 시간 버킷팅은 view의 세분화 수준에 맞게 조정됩니다.
-
최적 후보 선택
호환되는 materialized view가 여러 개 있으면 ClickStack은 각 후보에 대해
EXPLAIN ESTIMATE쿼리를 실행하고, 스캔할 것으로 추정되는 행 수와 그래뉼 수를 비교합니다. 추정 스캔 비용이 가장 낮은 view가 선택됩니다. - 자연스러운 폴백 호환되는 materialized view가 없으면 ClickStack은 자동으로 원본 테이블을 쿼리하는 방식으로 폴백합니다.
materialized view 선택 예시
otel_traces_1m: 분,ServiceName,StatusCode를 기준으로 그룹화됨otel_traces_1m_v2: 분,ServiceName,StatusCode,SpanName을 기준으로 그룹화됨
EXPLAIN ESTIMATE 쿼리를 실행한 뒤, 추정된 granule 수를 비교합니다. 즉:
otel_traces_1m는 더 작고 스캔하는 그래뉼 수가 더 적기 때문에 자동으로 선택됩니다.
두 materialized view 모두 기본 테이블(base table)을 직접 쿼리하는 것보다 여전히 성능이 뛰어나지만, 필요한 조건을 충족하는 가장 작은 뷰를 선택할 때 최상의 성능을 얻을 수 있습니다.
알림
materialized view 백필
백필 접근 방식
POPULATE 사용 피하기POPULATE 명령은 수집이 일시 중지된 소규모 데이터셋이 아닌 경우, materialized view를 백필하는 용도로는 권장되지 않습니다. 이 연산자는 원본 테이블에 삽입된 행을 놓칠 수 있으며, POPULATE 해시가 완료된 뒤 생성된 materialized view에는 해당 행이 반영되지 않을 수 있습니다. 또한 이 POPULATE는 전체 데이터를 대상으로 실행되므로, 대규모 데이터셋에서는 중단이나 메모리 제한의 영향을 받기 쉽습니다.
INSERT INTO SELECT를 사용한 직접 백필
뷰의 현재 커버리지 확인
백필을 시도하기 전에 먼저 materialized view에 이미 어떤 데이터가 들어 있는지 확인해야 합니다. 이를 위해 대상 테이블에 있는 최소 타임스탬프를 쿼리합니다:백필이 필요한지 결정
대부분의 ClickStack 배포에서는 지난 24시간과 같은 최근 데이터에 쿼리가 집중됩니다. 이런 경우 새로 생성된 뷰는 생성 후 곧 완전히 사용할 수 있으므로 백필이 필요하지 않습니다.이전 단계에서 반환된 타임스탬프가 사용 사례에 비해 충분히 오래되었다면 백필은 필요하지 않습니다. 백필은 다음과 같은 경우에만 고려해야 합니다:- 쿼리가 긴 과거 기간을 자주 포함합니다.
- 해당 기간 전반에서 뷰가 성능상 중요합니다.
- 데이터셋 크기와 집계 비용을 고려할 때 백필 수행이 현실적입니다.
Null 테이블을 사용한 증분 백필
INSERT INTO SELECT를 사용한 직접 백필이 비현실적이거나 안전하지 않을 수 있습니다. 이런 경우에는 증분 백필 방식을 권장합니다. 이 방법은 증분형 materialized view가 일반적으로 동작하는 방식에 더 가깝습니다. 즉, 전체 과거 데이터셋을 한 번에 집계하는 대신, 관리 가능한 블록 단위로 데이터를 처리합니다.
이 접근 방식은 다음과 같은 경우에 적합합니다.
- 백필 쿼리가 여러 시간 동안 실행될 수 있는 경우
- 전체 집계의 최대 메모리 사용량이 지나치게 높은 경우
- 백필 중 CPU 및 메모리 사용량을 세밀하게 제어하려는 경우
- 중단되더라도 안전하게 다시 시작할 수 있는, 더 복원력 있는 프로세스가 필요한 경우
백필용 Null 테이블 생성
materialized view의 집계에 필요한 컬럼만 포함하는 경량 Null 테이블을 생성합니다. 이렇게 하면 I/O 및 메모리 사용량을 최소화할 수 있습니다.Null 테이블에 materialized view 연결
다음으로, 프라이머리 materialized view가 사용하는 것과 동일한 집계 테이블을 대상으로 하는 materialized view를 Null 테이블에 생성합니다.데이터를 증분 방식으로 백필
마지막으로, 과거 데이터를 Null 테이블에 삽입합니다. materialized view는 데이터를 블록 단위로 처리하면서 원시 행은 저장하지 않고 대상 테이블에 집계 상태를 기록합니다.추가적인 안전성을 위해 백필용 materialized view의 대상을 임시 대상 테이블(예:
otel_traces_1m_v2)로 지정하는 방안을 고려하십시오. 백필이 성공적으로 완료되면 파티션을 프라이머리 대상 테이블로 이동할 수 있습니다. 예: ALTER TABLE otel_traces_1m_v2 MOVE PARTITION '2026-01-02' TO otel_traces_1m. 이렇게 하면 백필이 중단되거나 리소스 제한으로 실패하더라도 쉽게 복구할 수 있습니다.권장 사항
세분화 수준 선택 및 정렬
- 시간 차트(x축에 시간이 있는 선 또는 막대 차트): 차트에 명시된 세분화 수준은 materialized view 세분화 수준의 배수여야 합니다. 예를 들어, 10분 차트에서는 세분화 수준이 10분, 5분, 2분 또는 1분인 materialized view를 사용할 수 있지만, 20분 또는 3분 세분화 수준의 뷰는 사용할 수 없습니다.
-
비시간 차트(숫자, 테이블 또는 요약 차트):
실제 세분화 수준은
(time range / 80)으로 계산한 뒤, HyperDX가 지원하는 가장 가까운 세분화 수준으로 올림해 결정됩니다. 이렇게 계산된 세분화 수준 역시 materialized view 세분화 수준의 배수여야 합니다.
- 세분화 수준이 10분인 materialized view는 만들지 마십시오. ClickStack은 차트와 알림에 대해 15분 세분화 수준은 지원하지만 10분은 지원하지 않습니다. 따라서 10분 materialized view는 일반적으로 사용되는 15분 시각화 및 알림과 호환되지 않습니다.
- 대부분의 차트 및 알림 구성과 잘 맞는 1분 또는 1시간 세분화 수준을 우선적으로 사용하십시오.
materialized view 수 제한 및 통합
- 소스당 materialized view는 20개를 초과하지 않도록 하십시오.
- 일반적으로 materialized view 10개 내외가 가장 적절합니다.
- 공통 차원을 공유하는 경우 여러 시각화를 단일 뷰로 통합하십시오.
차원을 신중하게 선택하십시오
- 그룹화 컬럼이 하나 추가될 때마다 뷰의 크기가 커집니다.
- 쿼리 유연성과 스토리지 비용, 삽입 시점 비용 사이의 균형을 맞추십시오.
- 뷰에 없는 컬럼에 필터를 적용하면 ClickStack은 원본 테이블로 대체합니다.
팁일반적으로, 그리고 거의 항상 유용한 기본 구성은 서비스 이름과 count 메트릭으로 그룹화된 materialized view입니다. 이렇게 하면 검색과 대시보드에서 빠른 히스토그램과 서비스 수준 개요를 제공할 수 있습니다.
집계 컬럼 명명 규칙
- 패턴:
<aggFn>__<sourceColumn> - 예시:
avg__Durationmax__Duration- 행 수 집계를 위한
count__
분위수 및 스케치 선택
quantiles는 디스크에 더 큰 스케치를 생성하지만, 삽입 시점에 계산 비용이 더 적게 듭니다.quantileTDigest는 삽입 시점에 계산 비용이 더 크지만 더 작은 스케치를 생성하므로, 뷰 쿼리가 더 빨라지는 경우가 많습니다.
quantile(0.5))를 지정할 수 있습니다. 이렇게 생성된 스케치는 나중에 다른 분위수 값으로도 쿼리할 수 있습니다. 예를 들어 quantile(0.95)를 사용할 수 있습니다. 워크로드에 가장 적합한 균형을 찾으려면 직접 실험해 보는 것이 좋습니다.
효과를 지속적으로 검증하십시오
- UI의 가속 표시기를 통해 사용 여부를 확인하십시오.
- view 활성화 전후의 쿼리 성능을 비교하십시오.
- 리소스 사용량과 머지 동작을 모니터링하십시오.
고급 구성
- 최근 데이터용 고해상도 뷰와 과거 데이터용 저해상도 뷰
- 개요 확인용 서비스 수준 뷰와 심층 진단용 엔드포인트 수준 뷰
제한 사항
일반적인 비호환성 사유
- 쿼리 시간 범위 쿼리 시간 범위의 시작 시점이 materialized view의 최소 타임스탬프(timestamp)보다 이전이면 사용할 수 없습니다. 뷰는 자동으로 백필되지 않으므로, 전체 시간 범위를 완전히 커버하는 쿼리에만 사용할 수 있습니다.
-
세분화 수준 불일치
시각화의 유효 세분화 수준은 materialized view의 세분화 수준의 정확한 배수여야 합니다. 구체적으로는 다음과 같습니다.
- 시간 차트(x축에 시간이 있는 선 또는 막대 차트)의 경우, 차트에서 선택한 세분화 수준은 뷰의 세분화 수준의 배수여야 합니다. 예를 들어 10분 차트는 10분, 5분, 2분 또는 1분 materialized view를 사용할 수 있지만, 20분 또는 3분 뷰는 사용할 수 없습니다.
- 비시간 차트(숫자 또는 테이블 차트)의 경우, 유효 세분화 수준은
(time range / 80)으로 계산한 뒤 HyperDX가 지원하는 가장 가까운 세분화 수준으로 올림되며, 이 역시 뷰의 세분화 수준의 배수여야 합니다.
- 지원되지 않는 집계 함수 쿼리가 materialized view에 없는 집계를 요청하는 경우입니다. 뷰에서 명시적으로 계산되어 저장된 집계만 사용할 수 있습니다.
-
사용자 정의 count 표현식
count(if(...))와 같은 표현식이나 기타 조건부 count를 사용하는 쿼리는 표준 집계 상태로부터 계산할 수 없으므로 materialized view를 사용할 수 없습니다.
설계 및 운영상 제약 사항
- 자동 백필 없음 증분형 materialized view에는 생성 이후에 삽입된 데이터만 포함됩니다. 과거 데이터에 대한 가속을 적용하려면 명시적으로 백필해야 하며, 대규모 데이터셋에서는 비용 부담이 크거나 현실적이지 않을 수 있습니다.
- 세분화 수준의 트레이드오프 세분화 수준이 매우 높은 뷰는 저장소 크기와 삽입 시 오버헤드를 증가시키는 반면, 세분화 수준이 낮은 뷰는 유연성을 떨어뜨립니다. 세분화 수준은 예상되는 쿼리 패턴에 맞게 신중히 선택해야 합니다.
- 차원 폭증 그룹화 차원을 많이 추가하면 뷰 크기가 크게 증가하고 효율이 떨어질 수 있습니다. 뷰에는 자주 사용하는 그룹화 및 필터링 컬럼만 포함해야 합니다.
- 뷰 개수의 제한된 확장성 각 materialized view는 삽입 시 오버헤드를 추가하고 머지 부담을 높입니다. 뷰를 너무 많이 생성하면 수집과 백그라운드 머지에 부정적인 영향을 줄 수 있습니다.
문제 해결
materialized view가 사용되지 않는 경우
- 최적화 모달을 열어 “Date range not supported.”가 표시되는지 확인합니다.
- 쿼리의 날짜 범위가 materialized view의 최소 날짜 이후인지 확인합니다.
- materialized view에 전체 이력 데이터가 포함되어 있다면 최소 날짜를 제거합니다.
- 차트의 세분화 수준이 MV 세분화 수준의 배수인지 확인합니다.
- 차트를 “Auto”로 설정하거나 호환되는 세분화 수준을 수동으로 선택해 보십시오.
- 차트에서 사용하는 집계가 MV에 포함되어 있는지 확인합니다.
- 최적화 모달에서 “Available aggregated columns”를 검토합니다.
- GROUP BY 컬럼이 MV의 차원 컬럼에 포함되어 있는지 확인합니다.
- 최적화 모달에서 “Available group/filter columns”를 확인합니다.
느린 materialized view 쿼리
- 세분화 수준이 너무 낮아(예: 1초) MV의 행 수가 너무 많습니다.
- 해결 방법: 더 큰 단위의 MV를 생성하세요(예: 1분 또는 1시간).
- 차원 컬럼이 많아 MV의 카디널리티가 높습니다.
- 해결 방법: 가장 자주 사용하는 차원 컬럼만 남기고 줄이세요.
- 시스템이 각 MV에 대해
EXPLAIN을 실행합니다. - 해결 방법: 거의 사용하지 않거나 항상 건너뛰는 MV를 제거하세요.
구성 오류
- MV 구성에 집계 컬럼을 하나 이상 추가하십시오.
- 집계할 컬럼을 지정하십시오(
count만 대상 컬럼을 생략할 수 있습니다).
- 드롭다운에서 미리 정의된 세분화 수준 중 하나를 선택하십시오.
- 포맷은 유효한 SQL 인터벌이어야 합니다(예:
1 hour,1 h는 허용되지 않음).