uniqCombined
Поскольку для типов, отличных от String, используется 32-битный хеш, результат будет давать очень большую ошибку при мощностях множества, значительно превышающих
UINT_MAX (ошибка начнёт быстро расти после нескольких десятков миллиардов различных значений).
Если мощность множества превышает UINT_MAX, вместо этого следует использовать uniqCombined64.- Потребляет в несколько раз меньше памяти
- Обеспечивает точность в несколько раз выше
- Обычно работает немного медленнее. В некоторых сценариях uniqCombined может работать лучше, чем uniq, например при распределённых запросах, передающих по сети большое количество состояний агрегации
Подробности реализации
Подробности реализации
Эта функция вычисляет хеш (64-битный для String и 32-битный в остальных случаях) для всех параметров агрегатной функции, а затем использует его в вычислениях.
Она использует комбинацию из трёх алгоритмов: массив, хеш-таблица и HyperLogLog с таблицей коррекции ошибок:
- Для небольшого количества различных элементов используется массив
- Когда размер множества увеличивается, используется хеш-таблица
- Для ещё большего числа элементов используется HyperLogLog, который занимает фиксированный объём памяти
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
Примеры
Базовое использование
Query
Response
Query
Response