Перейти к основному содержимому
Перейти к основному содержимому

uniqCombined64

uniqCombined64

Впервые появилась в: v20.1

Вычисляет приблизительное количество различных значений аргумента. Аналогична функции uniqCombined, но использует 64-битный хеш для всех типов данных, а не только для типа данных String.

Эта функция возвращает детерминированный результат (он не зависит от порядка обработки запроса).

Примечание

Поскольку она использует 64-битный хеш для всех типов, результат не подвержен очень большой ошибке при мощностях множеств, значительно превышающих UINT_MAX, в отличие от uniqCombined, которая использует 32-битный хеш для типов, отличных от String.

По сравнению с функцией uniq, функция uniqCombined64:

  • Потребляет в несколько раз меньше памяти
  • Вычисляет значение с в несколько раз большей точностью
Details

Implementation details Эта функция вычисляет 64-битный хеш для всех типов данных по всем параметрам в агрегате, а затем использует его в вычислениях. Она использует комбинацию трёх алгоритмов: массив, хеш-таблицу и HyperLogLog с таблицей коррекции ошибки:

  • Для небольшого числа различных элементов используется массив
  • При большем размере множества используется хеш-таблица
  • Для ещё большего числа элементов используется HyperLogLog, который занимает фиксированный объём памяти

Синтаксис

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

Параметры

  • HLL_precision — Необязательный параметр. Двоичный логарифм количества ячеек в HyperLogLog. Значение по умолчанию — 17, что фактически соответствует 96 КиБ памяти (2^17 ячеек, по 6 бит каждая). Диапазон: [12, 20]. UInt8

Аргументы

Возвращаемое значение

Возвращает число типа UInt64, представляющее приблизительное количество различных значений аргументов. UInt64

Примеры

Пример для большого объёма данных

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 │ -- 10.00 billion
└────────────────────────┘
┌─uniqCombined(number)─┐
│           5545308725 │ -- 5.55 billion
└──────────────────────┘

См. также