avgMergeState 집계 함수 컴비네이터

avgMergeState 집계 함수 컴비네이터

MergeState 컴비네이터를 avg 함수에 적용하면, AverageFunction(avg, T) 타입의 부분 집계 상태들을 병합해 새로운 중간 집계 상태를 반환할 수 있어요.

출처: 문서

본문

예시 사용법

MergeState 컴비네이터는 사전 집계된 상태들을 결합하고, 추가 처리를 위해 그것들을 상태로 유지(최종화하지 않고)하려는 다중 레벨 집계 시나리오에서 특히 유용해요. 설명을 위해 개별 서버 성능 메트릭을 여러 레벨(Sever level → Region level → Datacenter level)에 걸친 계층형 집계로 변환하는 예시를 살펴볼게요. 먼저 원시 데이터를 저장할 테이블을 만들어요.

CREATE TABLE raw_server_metrics
(
    timestamp DateTime DEFAULT now(),
    server_id UInt32,
    region String,
    datacenter String,
    response_time_ms UInt32
)
ENGINE = MergeTree()
ORDER BY (region, server_id, timestamp);

서버 레벨 집계 대상 테이블을 만들고, 그것으로의 insert 트리거 역할을 하는 증분(Incremental) 매터리얼라이즈드 뷰를 정의해요.

CREATE TABLE server_performance
(
    server_id UInt32,
    region String,
    datacenter String,
    avg_response_time AggregateFunction(avg, UInt32)
)
ENGINE = AggregatingMergeTree()
ORDER BY (region, server_id);

CREATE MATERIALIZED VIEW server_performance_mv
TO server_performance
AS SELECT
    server_id,
    region,
    datacenter,
    avgState(response_time_ms) AS avg_response_time
FROM raw_server_metrics
GROUP BY server_id, region, datacenter;

리전과 데이터센터 레벨에 대해서도 동일하게 할게요.

CREATE TABLE region_performance
(
    region String,
    datacenter String,
    avg_response_time AggregateFunction(avg, UInt32)
)
ENGINE = AggregatingMergeTree()
ORDER BY (datacenter, region);

CREATE MATERIALIZED VIEW region_performance_mv
TO region_performance
AS SELECT
    region,
    datacenter,
    avgMergeState(avg_response_time) AS avg_response_time
FROM server_performance
GROUP BY region, datacenter;

-- datacenter level table and materialized view

CREATE TABLE datacenter_performance
(
    datacenter String,
    avg_response_time AggregateFunction(avg, UInt32)
)
ENGINE = AggregatingMergeTree()
ORDER BY datacenter;

CREATE MATERIALIZED VIEW datacenter_performance_mv
TO datacenter_performance
AS SELECT
      datacenter,
      avgMergeState(avg_response_time) AS avg_response_time
FROM region_performance
GROUP BY datacenter;

그런 다음 샘플 원시 데이터를 소스 테이블에 삽입해요.

INSERT INTO raw_server_metrics (timestamp, server_id, region, datacenter, response_time_ms) VALUES
    (now(), 101, 'us-east', 'dc1', 120),
    (now(), 101, 'us-east', 'dc1', 130),
    (now(), 102, 'us-east', 'dc1', 115),
    (now(), 201, 'us-west', 'dc1', 95),
    (now(), 202, 'us-west', 'dc1', 105),
    (now(), 301, 'eu-central', 'dc2', 145),
    (now(), 302, 'eu-central', 'dc2', 155);

각 레벨에 대해 세 개의 쿼리를 작성할게요.

  • 서비스 레벨

  • 리전 레벨

  • 데이터센터 레벨

    SELECT server_id, region, avgMerge(avg_response_time) AS avg_response_ms FROM server_performance GROUP BY server_id, region ORDER BY region, server_id;

    ┌─server_id─┬─region─────┬─avg_response_ms─┐ │ 301 │ eu-central │ 145 │ │ 302 │ eu-central │ 155 │ │ 101 │ us-east │ 125 │ │ 102 │ us-east │ 115 │ │ 201 │ us-west │ 95 │ │ 202 │ us-west │ 105 │ └───────────┴────────────┴─────────────────┘

    SELECT region, datacenter, avgMerge(avg_response_time) AS avg_response_ms FROM region_performance GROUP BY region, datacenter ORDER BY datacenter, region;

    ┌─region─────┬─datacenter─┬────avg_response_ms─┐ │ us-east │ dc1 │ 121.66666666666667 │ │ us-west │ dc1 │ 100 │ │ eu-central │ dc2 │ 150 │ └────────────┴────────────┴────────────────────┘

    SELECT datacenter, avgMerge(avg_response_time) AS avg_response_ms FROM datacenter_performance GROUP BY datacenter ORDER BY datacenter;

    ┌─datacenter─┬─avg_response_ms─┐ │ dc1 │ 113 │ │ dc2 │ 150 │ └────────────┴─────────────────┘

데이터를 더 삽입할 수 있어요.

INSERT INTO raw_server_metrics (timestamp, server_id, region, datacenter, response_time_ms) VALUES
    (now(), 101, 'us-east', 'dc1', 140),
    (now(), 201, 'us-west', 'dc1', 85),
    (now(), 301, 'eu-central', 'dc2', 135);

데이터센터 레벨 성능을 다시 확인해 볼게요. 전체 집계 체인이 자동으로 업데이트된 것에 주목하세요.

SELECT
    datacenter,
    avgMerge(avg_response_time) AS avg_response_ms
FROM datacenter_performance
GROUP BY datacenter
ORDER BY datacenter;

┌─datacenter─┬────avg_response_ms─┐
│ dc1        │ 112.85714285714286 │
│ dc2        │                145 │
└────────────┴────────────────────┘

더 알아보기 (Learn more)