uniqCombined

uniqCombined

서로 다른 인자 값의 개수를 근사 계산하는 집계 함수예요. 배열·해시 테이블·HyperLogLog를 결합한 세 가지 알고리즘을 조합해서 메모리를 적게 쓰고 정확도가 높아요.

출처: 문서

본문

uniqCombined은 서로 다른 인자 값의 개수를 근사 계산해요. 결과를 결정적으로 제공해요(쿼리 처리 순서에 의존하지 않아요).

String이 아닌 타입에 32비트 해시를 사용하기 때문에, 카디널리티가 UINT_MAX보다 훨씬 커지면 결과 오차가 매우 커져요(수백억 개의 고유 값을 넘어가면 오차가 빠르게 증가해요). 카디널리티가 UINT_MAX보다 큰 경우에는 대신 uniqCombined64를 사용해야 해요.

uniq 함수와 비교해 uniqCombined 함수는:

  • 메모리를 몇 배 덜 소비해요
  • 정확도가 몇 배 더 높아요
  • 보통 성능이 약간 낮아요. 일부 시나리오에서는 uniqCombineduniq보다 더 잘 동작할 수 있어요. 예를 들어 네트워크로 많은 수의 집계 상태를 전송하는 분산 쿼리에서요.

구현 세부 사항

이 함수는 집계의 모든 인자에 대해 해시를 계산한 다음(각각 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 │
└──────────────────────────┘

더 알아보기 (Learn more)