SummingMergeTree 테이블의 데이터 파트를 머지할 때 ClickHouse가 동일한 프라이머리 키(primary key), 더 정확히는 동일한 정렬 키를 가진 모든 행을 숫자 데이터 타입 컬럼의 값이 합산된 하나의 행으로 대체한다는 점입니다. 정렬 키가 하나의 키 값에 많은 수의 행이 대응되도록 구성되어 있으면 저장 용량이 크게 줄고 데이터 조회 속도도 빨라집니다.
이 엔진은 MergeTree와 함께 사용할 것을 권장합니다. 전체 데이터는 MergeTree 테이블에 저장하고, 예를 들어 보고서 작성 시에는 집계된 데이터를 저장하는 용도로 SummingMergeTree를 사용하십시오. 이렇게 하면 프라이머리 키를 잘못 구성해 중요한 데이터를 잃는 일을 방지할 수 있습니다.
테이블 생성하기
SummingMergeTree 매개변수
컬럼
columns - 값이 합산될 컬럼 이름을 담은 튜플입니다. 선택적 매개변수입니다.
해당 컬럼은 숫자형이어야 하며 파티션 또는 정렬 키(sorting key)에 포함되어서는 안 됩니다.
columns를 지정하지 않으면 ClickHouse는 정렬 키에 포함되지 않은 숫자 데이터 타입의 모든 컬럼 값을 합산합니다.
쿼리 절
SummingMergeTree 테이블을 생성할 때는 MergeTree 테이블을 생성할 때와 동일한 절이 필요합니다.
사용 예시
sum과 GROUP BY 절을 사용합니다.
데이터 처리
GROUP BY 절(clause)을 사용해야 합니다.
합산에 대한 일반 규칙
columns로 지정됩니다.
합산 대상인 모든 컬럼의 값이 0이면 해당 행은 삭제됩니다.
컬럼이 프라이머리 키(primary key)에 포함되지 않고 합산 대상도 아니면, 기존 값 중 하나가 임의로 선택됩니다.
프라이머리 키에 포함된 컬럼의 값은 합산되지 않습니다.
AggregateFunction 컬럼에서의 합산
중첩 구조
Map으로 끝나고, 다음 기준을 충족하는 컬럼을 최소 두 개 이상 포함하는 경우:
- 첫 번째 컬럼이 숫자형
(*Int*, Date, DateTime)또는 문자열(String, FixedString)이며, 이를key라고 합니다. - 나머지 컬럼이 산술형
(*Int*, Float32/64)이며, 이를(values...)라고 합니다.
key => (values...) 매핑으로 해석되며, 행을 머지할 때 두 데이터 집합의 요소는 key를 기준으로 머지되고 해당 (values...)는 합산됩니다.
예시:
Map 집계에 sumMap(key, value) 함수를 사용합니다.
중첩된 데이터 구조에서는 합산할 컬럼의 튜플에 해당 컬럼들을 지정할 필요가 없습니다.
Tuple 요소 집계
allow_tuple_element_aggregation 설정이 활성화되면 Tuple 컬럼은 각 리프 요소가 독립적으로 합산에 참여할 수 있도록 재귀적으로 평탄화됩니다. 이를 통해 여러 메트릭을 하나의 Tuple 컬럼에 저장하고, 머지 중 요소별로 합산할 수 있습니다.
평탄화된 서브컬럼에는 일반 컬럼과 동일한 규칙이 적용됩니다:
- 숫자형 서브컬럼만 합산됩니다.
- 정렬 키 또는 파티션 키에 포함된
Tuple의 서브컬럼은 합산에서 제외됩니다. columns를 지정한 경우, 나열된Tuple컬럼의 서브컬럼만 합산됩니다.- 합산 후 행의 모든 숫자형 서브컬럼이 0이면 해당 행은 삭제됩니다.
이 설정은 변경할 수 없으며 테이블 생성 시에 지정해야 합니다.