AggregatingMergeTree 테이블은 집계된 materialized view를 포함해 데이터의 증분 집계에 사용할 수 있습니다.
아래 동영상에서 AggregatingMergeTree와 집계 함수 사용 예시를 확인할 수 있습니다:
AggregatingMergeTree는 행 수를 자릿수 수준으로 크게 줄일 수 있을 때 사용하는 것이 적절합니다.
테이블 만들기
AggregatingMergeTree 테이블을 생성할 때는 MergeTree 테이블을 생성할 때와 동일한 절이 필요합니다.
SELECT 및 INSERT
AggregatingMergeTree 테이블에서 데이터를 선택할 때는 GROUP BY 절과 데이터 삽입 시 사용한 것과 동일한 집계 함수를 사용하되, -Merge 접미사를 사용합니다.
SELECT 쿼리 결과에서 AggregateFunction 유형의 값은 모든 ClickHouse 출력 형식에서 구현별 이진 표현을 가집니다. 예를 들어, SELECT 쿼리로 데이터를 TabSeparated 포맷으로 덤프하면, 이 덤프를 INSERT 쿼리로 다시 로드할 수 있습니다.
집계된 materialized view 예시
test라는 데이터베이스가 있다고 가정합니다. 아래 명령으로 아직 존재하지 않으면 생성하세요:
test.visits 테이블을 생성합니다:
AggregationFunction을 저장할 AggregatingMergeTree 테이블이 필요합니다.
AggregatingMergeTree materialized view를 생성하여 test.visits 테이블을 모니터링하고 AggregateFunction 타입을 사용합니다:
test.visits에서 test.agg_visits를 채우는 materialized view를 생성하세요:
test.visits 테이블에 데이터를 삽입하세요:
test.visits와 test.agg_visits 양쪽 모두에 삽입됩니다.
집계된 데이터를 가져오려면 materialized view test.visits_mv에서 SELECT ... GROUP BY ...와 같은 쿼리를 실행하십시오:
test.visits에 레코드를 몇 개 더 추가하되, 이번에는 레코드 중 하나에 다른 타임스탬프(timestamp)를 사용해 보십시오:
SELECT 쿼리를 다시 실행하면 다음과 같은 결과가 반환됩니다:
GROUP BY 절에 집계 대상이 아닌 컬럼도 포함해야 합니다. 그러나 optimize_on_insert = 0 설정(기본값은 활성화)과 함께 initializeAggregation 함수를 사용하면 이를 구현할 수 있습니다. 이 경우 GROUP BY는 더 이상 필요하지 않습니다:
initializeAggregation을 사용하면 그룹화 없이 각 개별 행마다 집계 상태가 생성됩니다.
각 소스 행은 materialized view에 하나의 행을 생성하며, 실제 집계는 나중에
AggregatingMergeTree가 파트를 머지할 때 이루어집니다. 이는 optimize_on_insert = 0인 경우에만 적용됩니다.Tuple 요소 집계
allow_tuple_element_aggregation 설정이 활성화되면 Tuple 컬럼은 각 리프 요소가 독립적으로 집계에 참여할 수 있도록 재귀적으로 평탄화됩니다. 즉, Tuple 내부의 AggregateFunction 또는 SimpleAggregateFunction 서브컬럼은 최상위 컬럼인 것처럼 각 함수에 따라 집계됩니다.
정렬 키에 속하는 Tuple의 서브컬럼은 집계에서 제외됩니다. 집계 함수가 아닌 서브컬럼은 일반 컬럼으로 처리되며 첫 번째 값이 유지됩니다.
이 설정은 변경할 수 없으며 테이블 생성 시 지정해야 합니다.
total_visits는 sum으로 집계되고(100 + 200 = 300), unique_users는 max로 집계됩니다(max(5, 8) = 8).