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

uniqCombined

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

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

Аргументы

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

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

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

Функция uniqCombined:

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

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

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

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

Пример

Запрос:

Результат:

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

См. также