uniqCombined
uniqCombined
Впервые представлена в версии v1.1
Вычисляет приблизительное количество различных значений аргумента. Возвращает результат детерминированно (он не зависит от порядка обработки запроса).
Поскольку для типов, отличных от String, используется 32-битный хеш, результат будет иметь очень большую погрешность при кардинальностях, значительно превышающих UINT_MAX (погрешность быстро возрастает после нескольких десятков миллиардов различных значений).
Если кардинальность множества превышает UINT_MAX, следует использовать uniqCombined64.
По сравнению с функцией uniq, функция uniqCombined:
- Потребляет в несколько раз меньше памяти
- Вычисляет результат с в несколько раз более высокой точностью
- Обычно имеет немного более низкую производительность. В некоторых сценариях uniqCombined может работать лучше, чем uniq, например, при распределённых запросах, которые передают по сети большое количество состояний агрегации
Details
Подробности реализации
Эта функция вычисляет хеш (64-битный хеш для String и 32-битный в остальных случаях) для всех параметров в агрегате, затем использует его в вычислениях. Используется комбинация трёх алгоритмов: массив, хеш-таблица и HyperLogLog с таблицей коррекции ошибок:- Для небольшого количества различных элементов используется массив
- Когда мощность множества больше, используется хеш-таблица
- Для большого количества элементов используется HyperLogLog, который занимает фиксированный объём памяти
Синтаксис
Параметры
HLL_precision— Необязательный параметр. Двоичный логарифм числа ячеек в HyperLogLog. Значение по умолчанию — 17, что соответствует примерно 96 KiB памяти (2^17 ячеек, по 6 бит каждая). Диапазон: [12, 20].UInt8
Аргументы
x— Переменное количество параметров.Tuple(T)илиArray(T)илиDateилиDateTimeилиStringили(U)Int*илиFloat*илиDecimal
Возвращаемое значение
Возвращает число типа UInt64, представляющее приблизительное количество различных значений аргументов. UInt64
Примеры
Базовое использование
С настраиваемой точностью
См. также