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

uniqCombined

uniqCombined

Впервые представлена в версии v1.1

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

Примечание

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

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

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

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

  • Для небольшого количества различных элементов используется массив
  • Когда мощность множества больше, используется хеш-таблица
  • Для большого количества элементов используется HyperLogLog, который занимает фиксированный объём памяти

Синтаксис

uniqCombined(HLL_precision)(x[, ...])
uniqCombined(x[, ...])

Параметры

  • HLL_precision — Необязательный параметр. Двоичный логарифм числа ячеек в HyperLogLog. Значение по умолчанию — 17, что соответствует примерно 96 KiB памяти (2^17 ячеек, по 6 бит каждая). Диапазон: [12, 20]. UInt8

Аргументы

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

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

Примеры

Базовое использование

SELECT uniqCombined(number) FROM numbers(1e6);
┌─uniqCombined(number)─┐
│              1001148 │
└──────────────────────┘

С настраиваемой точностью

SELECT uniqCombined(15)(number) FROM numbers(1e5);
┌─uniqCombined(15)(number)─┐
│                   100768 │
└──────────────────────────┘

См. также