uniqCombined64

uniqCombined64

서로 다른 인자 값의 개수를 근사 계산하는 집계 함수예요. uniqCombined와 같지만 모든 데이터 타입에 대해 32비트가 아닌 64비트 해시를 사용해서 대규모 카디널리티에서도 정확해요.

출처: 문서

본문

uniqCombined64은 서로 다른 인자 값의 개수를 근사 계산해요. uniqCombined과 동일하지만 String 타입에만 적용되는 64비트 해시를 모든 데이터 타입에 사용해요. 이 함수는 결과를 결정적으로 제공해요(쿼리 처리 순서에 의존하지 않아요).

모든 타입에 64비트 해시를 사용하기 때문에, String이 아닌 타입에 32비트 해시를 사용하는 uniqCombined처럼 UINT_MAX보다 훨씬 큰 카디널리티에서 매우 큰 오차가 발생하지 않아요.

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

  • 메모리를 몇 배 덜 소비해요
  • 정확도가 몇 배 더 높아요

구현 세부 사항

이 함수는 집계의 모든 인자에 대해 모든 데이터 타입의 64비트 해시를 계산한 다음, 이를 계산에 사용해요. 배열, 해시 테이블, HyperLogLog(오차 보정 테이블 포함) 세 가지 알고리즘을 조합해서 사용해요:

  • 고유 요소가 적으면 배열을 사용해요
  • 집합 크기가 커지면 해시 테이블을 사용해요
  • 요소가 더 많아지면 고정 메모리를 차지하는 HyperLogLog를 사용해요

구문 (Syntax)

uniqCombined64(HLL_precision)(x[, ...])
uniqCombined64(x[, ...])

매개변수 (Parameters)

  • HLL_precision — 선택 사항. HyperLogLog의 셀 개수의 밑이 2인 로그 값. 기본값은 17로, 사실상 96 KiB 공간(셀 2^17개, 각 6비트)에 해당해요. 범위: [12, 20]. UInt8

인자 (Arguments)

반환 값 (Returned value)

서로 다른 인자 값의 근사 개수를 나타내는 UInt64 타입 숫자. UInt64

예제 (Examples)

대규모 데이터셋 예제

쿼리:

SELECT uniqCombined64(number) FROM numbers(1e10);

응답:

┌─uniqCombined64(number)─┐
│             9998568925 │
└────────────────────────┘

uniqCombined와 비교

쿼리:

-- uniqCombined64 with large dataset
SELECT uniqCombined64(number) FROM numbers(1e10);

-- uniqCombined with same dataset shows poor approximation
SELECT uniqCombined(number) FROM numbers(1e10);

응답:

┌─uniqCombined64(number)─┐
│             9998568925 │
└────────────────────────┘
┌─uniqCombined(number)─┐
│           5545308725 │
└──────────────────────┘

더 알아보기 (Learn more)