uniqCombined
Добавленный в: v1.1.0
Вычисляет приблизительное количество различных значений аргумента. Возвращает результат детерминированно (он не зависит от порядка обработки запроса).
По сравнению с функцией uniq, функция uniqCombined:
- Потребляет в несколько раз меньше памяти
- Обеспечивает точность в несколько раз выше
- Обычно работает немного медленнее. В некоторых сценариях uniqCombined может работать лучше, чем uniq, например при распределённых запросах, передающих по сети большое количество состояний агрегации
Подробности реализации
Эта функция вычисляет хеш (64-битный для String и 32-битный в остальных случаях) для всех параметров агрегатной функции, а затем использует его в вычислениях. Она использует комбинацию из трёх алгоритмов: массив, хеш-таблица и HyperLogLog с таблицей коррекции ошибок:
- Для небольшого количества различных элементов используется массив
- Когда размер множества увеличивается, используется хеш-таблица
- Для ещё большего числа элементов используется HyperLogLog, который занимает фиксированный объём памяти
Синтаксис
uniqCombined(HLL_precision)(x[, ...])
uniqCombined(x[, ...])Параметры
HLL_precision— Необязательный. Логарифм по основанию 2 от числа ячеек в HyperLogLog. Значение по умолчанию — 17, что соответствует примерно 96 КиБ памяти (2^17 ячеек по 6 бит каждая). Диапазон: [12, 20].UInt8
Аргументы
x— Переменное число аргументов.Tuple(T)илиArray(T)илиDateилиDateTimeилиStringили(U)Int*илиFloat*илиDecimal
Возвращаемое значение
Возвращает число типа UInt64, представляющее приблизительное количество различных значений аргументов. UInt64
Примеры
Базовое использование
SELECT uniqCombined(number) FROM numbers(1e6);┌─uniqCombined(number)─┐
│ 1001148 │
└──────────────────────┘С настраиваемой точностью
SELECT uniqCombined(15)(number) FROM numbers(1e5);┌─uniqCombined(15)(number)─┐
│ 100768 │
└──────────────────────────┘См. также