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

uniqCombined

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

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

Аргументы

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

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

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

Функция uniqCombined:

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

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

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

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

Пример

Запрос:

Результат:

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

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