ClickHouse/docs/ru/sql-reference/aggregate-functions/reference/uniqcombined.md
BayoNet c1b71ab06e
DOCS-733: Fixed broken links in Russian version (#13106)
* CLICKHOUSEDOCS-733: Fixed some broken links. Updated introduction and TOC in aggregate functions.

* CLICKHOUSEDOCS-733: Fixed files endings.

* CLICKHOUSEDOCS-733: Returned the list of functions back to reference index.

Co-authored-by: Sergei Shtykov <bayonet@yandex-team.ru>
Co-authored-by: emironyuk <em@don.ru>
2020-07-30 15:49:19 +03:00

4.2 KiB
Raw Blame History

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 бит каждая).

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

Детали реализации

Функция:

  • Вычисляет хэш (64-битный для String и 32-битный для всех остальных типов) для всех параметров агрегации, а затем использует его в вычислениях.

  • Используется комбинация трёх алгоритмов: массив, хэш-таблица и HyperLogLog с таблицей коррекции погрешности.

    Для небольшого количества различных значений используется массив. Если размер набора больше, используется хэш-таблица. При дальнейшем увеличении количества значений, используется структура HyperLogLog, имеющая фиксированный размер в памяти.
    
  • Результат детерминирован (не зависит от порядка выполнения запроса).

!!! note "Note" Так как используется 32-битный хэш для не-String типов, результат будет иметь очень очень большую ошибку для количества разичных элементов существенно больше UINT_MAX (ошибка быстро растёт начиная с нескольких десятков миллиардов различных значений), таким образом в этом случае нужно использовать uniqCombined64

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

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

Смотрите также

Оригинальная статья