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

uniqCombined

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

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

Функция uniqCombined — хороший выбор для вычисления количества различных значений.

Аргументы

  • HLL_precision: двоичный логарифм числа ячеек в HyperLogLog. Необязательный параметр, функцию можно вызывать как uniqCombined(x[, ...]). Значение по умолчанию для HLL_precision — 17, что фактически соответствует 96 КиБ памяти (2^17 ячеек, по 6 бит каждая).
  • X: произвольное количество параметров. Параметры могут иметь типы Tuple, Array, Date, DateTime, String или числовые типы.

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

Подробности реализации

Функция uniqCombined:

  • Вычисляет хеш (64-битный хеш для String и 32-битный в остальных случаях) для всех параметров при агрегации и затем использует его в вычислениях.
  • Использует комбинацию из трёх алгоритмов: массива, хеш-таблицы и HyperLogLog с таблицей коррекции ошибки.
    • Для небольшого количества различных элементов используется массив.
    • Когда размер множества становится больше, используется хеш-таблица.
    • Для ещё большего количества элементов используется HyperLogLog, который занимает фиксированный объём памяти.
  • Возвращает детерминированный результат (он не зависит от порядка обработки запроса).
Примечание

Поскольку для типов, отличных от String, используется 32-битный хеш, результат будет иметь очень большую погрешность для мощностей, значительно превышающих UINT_MAX (ошибка будет быстро расти после нескольких десятков миллиардов различных значений); поэтому в таком случае следует использовать uniqCombined64.

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

  • Потребляет в несколько раз меньше памяти.
  • Обеспечивает точность, в несколько раз превосходящую uniq.
  • Обычно имеет немного более низкую производительность. В некоторых сценариях uniqCombined может работать быстрее, чем uniq, например, при распределённых запросах, которые передают по сети большое количество состояний агрегации.

Пример

Запрос:

SELECT uniqCombined(number) FROM numbers(1e6);

Результат:

┌─uniqCombined(number)─┐
│              1001148 │ -- 1.00 million
└──────────────────────┘

См. раздел с примером в uniqCombined64 для иллюстрации различий между uniqCombined и uniqCombined64 при работе с гораздо большими объёмами входных данных.

См. также