예시: 도메인 이름 그룹의 시간당 조회 수를 담은 가상의 데이터셋을 사용하겠습니다. 목표
- 각 도메인 이름별로 월 단위 집계 데이터가 필요합니다.
- 각 도메인 이름별로 연 단위 집계 데이터도 필요합니다.
- SELECT 요청 시 데이터를 읽고 집계하는 쿼리를 작성합니다.
- 수집 시점에 데이터를 새로운 포맷으로 준비합니다.
- 수집 시점에 데이터를 특정 집계 형태로 준비합니다.
materialized view용 소스 테이블
Null 테이블 엔진을 사용합니다.
Null 테이블에 materialized view를 생성할 수 있습니다. 따라서 테이블에 기록된 데이터는 뷰에 반영되지만, 원본 원시 데이터는 계속 폐기됩니다.
월별 집계 테이블 및 materialized view
Target 테이블을 생성해야 합니다. 이 예시에서는 analytics.monthly_aggregated_data를 사용하며, 월별 도메인 이름 기준 조회수 합계를 저장합니다.
연도별 집계 테이블과 materialized view
monthly_aggregated_data에 연결될 두 번째 Materialized view를 생성하겠습니다.
먼저 각 도메인 이름별로 연도 단위로 집계한 조회 수 합계를 저장할 새 대상 테이블(target table)을 생성하겠습니다.
FROM 문은 monthly_aggregated_data 테이블을 사용하므로, 데이터 흐름은 다음과 같습니다.
- 데이터가
hourly_data테이블로 들어옵니다. - ClickHouse는 수신한 데이터를 첫 번째 materialized view인
monthly_aggregated_data테이블로 전달합니다. - 마지막으로 2단계에서 수신한 데이터가
year_aggregated_data테이블로 전달됩니다.
materialized view를 사용할 때 흔히 하는 오해는 데이터가 테이블에서 읽힌다고 생각하는 것입니다. 하지만
Materialized views는 그런 방식으로 동작하지 않습니다. 전달되는 데이터는 테이블의 최종 결과가 아니라 삽입된 block입니다.이 예시에서는 monthly_aggregated_data에 사용된 engine이 CollapsingMergeTree라고 가정하겠습니다. 이 경우 두 번째 materialized view인 year_aggregated_data_mv로 전달되는 것은 축약된 테이블의 최종 결과가 아니라, SELECT ... GROUP BY에 정의된 field를 가진 데이터 block입니다.CollapsingMergeTree, ReplacingMergeTree 또는 SummingMergeTree를 사용하면서 캐스케이딩 materialized view를 만들 계획이라면, 여기에서 설명하는 제한 사항을 이해해야 합니다.예제 데이터
analytics.hourly_data의 내용을 SELECT하면 테이블 엔진이 Null이기 때문에 데이터는 처리되었지만 다음과 같이 표시됩니다.
결과
sumCountViews 필드를 선택해 대상 테이블을 쿼리하면, 값이 숫자가 아니라 AggregateFunction 타입으로 저장되기 때문에 이진 표현이 표시됩니다(일부 터미널에서).
집계의 최종 결과를 얻으려면 -Merge 접미사를 사용해야 합니다.
다음 쿼리를 사용하면 AggregateFunction에 저장된 특수 문자를 확인할 수 있습니다:
sumCountViews 값을 가져오기 위해 Merge 접미사를 사용해 보겠습니다:
AggregatingMergeTree에서는 AggregateFunction을 sum으로 정의했으므로 sumMerge를 사용할 수 있습니다. AggregateFunction에 avg 함수를 사용한 경우에는 avgMerge를 사용하며, 다른 함수도 마찬가지입니다.
monthly_aggregated_data에 저장되었으므로, 각 도메인 이름별 월간 집계 데이터를 가져올 수 있습니다:
여러 소스 테이블을 하나의 대상 테이블로 결합하기
UNION ALL과 유사한 로직의 materialized view를 생성할 때 유용합니다.
먼저, 서로 다른 메트릭 집합을 나타내는 두 개의 소스 테이블을 생성합니다:
Target 테이블을 생성합니다:
Target 테이블을 대상으로 하는 materialized view 2개를 생성합니다. 누락된 컬럼은 명시적으로 포함하지 않아도 됩니다:
Target 테이블의 각 컬럼에 맞게 집계됩니다:
Target 테이블에 함께 저장됩니다: