4.1 KiB
toc_priority |
---|
192 |
uniqCombined
Приближённо вычисляет количество различных значений аргумента.
uniqCombined(HLL_precision)(x[, ...])
Функция uniqCombined
— это хороший выбор для вычисления количества различных значений.
Аргументы
Функция принимает переменное число входных параметров. Параметры могут быть числовых типов, а также Tuple
, Array
, Date
, DateTime
, String
.
HLL_precision
— это логарифм по основанию 2 от числа ячеек в HyperLogLog. Необязательный, можно использовать функцию как uniqCombined (x [,...])
. Для HLL_precision
значение по умолчанию — 17, что фактически составляет 96 КБ пространства (2^17 ячеек, 6 бит каждая).
Возвращаемое значение
- Число типа UInt64.
Детали реализации
Функция:
-
Вычисляет хэш (64-битный для
String
и 32-битный для всех остальных типов) для всех параметров агрегации, а затем использует его в вычислениях. -
Используется комбинация трёх алгоритмов: массив, хэш-таблица и HyperLogLog с таблицей коррекции погрешности.
Для небольшого количества различных значений используется массив. Если размер набора больше, используется хэш-таблица. При дальнейшем увеличении количества значений, используется структура HyperLogLog, имеющая фиксированный размер в памяти.
-
Результат детерминирован (не зависит от порядка выполнения запроса).
!!! note "Note"
Так как используется 32-битный хэш для не-String
типов, результат будет иметь очень очень большую ошибку для количества разичных элементов существенно больше UINT_MAX
(ошибка быстро растёт начиная с нескольких десятков миллиардов различных значений), таким образом в этом случае нужно использовать uniqCombined64
По сравнению с функцией uniq, uniqCombined
:
- Потребляет в несколько раз меньше памяти.
- Вычисляет с в несколько раз более высокой точностью.
- Обычно имеет немного более низкую производительность. В некоторых сценариях
uniqCombined
может показывать более высокую производительность, чемuniq
, например, в случае распределенных запросов, при которых по сети передаётся большое количество состояний агрегации.
Смотрите также