uniqCombined
uniqCombined
서로 다른 인자 값의 개수를 근사 계산하는 집계 함수예요. 배열·해시 테이블·HyperLogLog를 결합한 세 가지 알고리즘을 조합해서 메모리를 적게 쓰고 정확도가 높아요.
출처: 문서
본문
uniqCombined은 서로 다른 인자 값의 개수를 근사 계산해요. 결과를 결정적으로 제공해요(쿼리 처리 순서에 의존하지 않아요).
String이 아닌 타입에 32비트 해시를 사용하기 때문에, 카디널리티가 UINT_MAX보다 훨씬 커지면 결과 오차가 매우 커져요(수백억 개의 고유 값을 넘어가면 오차가 빠르게 증가해요). 카디널리티가 UINT_MAX보다 큰 경우에는 대신 uniqCombined64를 사용해야 해요.
uniq 함수와 비교해 uniqCombined 함수는:
- 메모리를 몇 배 덜 소비해요
- 정확도가 몇 배 더 높아요
- 보통 성능이 약간 낮아요. 일부 시나리오에서는
uniqCombined가uniq보다 더 잘 동작할 수 있어요. 예를 들어 네트워크로 많은 수의 집계 상태를 전송하는 분산 쿼리에서요.
구현 세부 사항
이 함수는 집계의 모든 인자에 대해 해시를 계산한 다음(각각 String은 64비트, 그 외에는 32비트), 이를 계산에 사용해요. 배열, 해시 테이블, 오차 보정 테이블이 있는 HyperLogLog 세 가지 알고리즘을 조합해서 사용해요:
- 고유 요소가 적으면 배열을 사용해요
- 집합 크기가 커지면 해시 테이블을 사용해요
- 요소가 더 많아지면 고정 메모리를 차지하는 HyperLogLog를 사용해요
구문 (Syntax)
uniqCombined(HLL_precision)(x[, ...])
uniqCombined(x[, ...])
매개변수 (Parameters)
HLL_precision— 선택 사항. HyperLogLog의 셀 개수의 밑이 2인 로그 값. 기본값은 17로, 사실상 96 KiB 공간(셀 2^17개, 각 6비트)에 해당해요. 범위: [12, 20].UInt8
인자 (Arguments)
반환 값 (Returned value)
서로 다른 인자 값의 근사 개수를 나타내는 UInt64 타입 숫자. UInt64
예제 (Examples)
기본 사용
쿼리:
SELECT uniqCombined(number) FROM numbers(1e6);
응답:
┌─uniqCombined(number)─┐
│ 1001148 │
└──────────────────────┘
사용자 지정 정밀도 사용
쿼리:
SELECT uniqCombined(15)(number) FROM numbers(1e5);
응답:
┌─uniqCombined(15)(number)─┐
│ 100768 │
└──────────────────────────┘