mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-29 05:00:47 +00:00
52 lines
4.1 KiB
Markdown
52 lines
4.1 KiB
Markdown
|
---
|
|||
|
toc_priority: 192
|
|||
|
---
|
|||
|
|
|||
|
# uniqCombined {#agg_function-uniqcombined}
|
|||
|
|
|||
|
Приближённо вычисляет количество различных значений аргумента.
|
|||
|
|
|||
|
``` sql
|
|||
|
uniqCombined(HLL_precision)(x[, ...])
|
|||
|
```
|
|||
|
|
|||
|
Функция `uniqCombined` — это хороший выбор для вычисления количества различных значений.
|
|||
|
|
|||
|
**Параметры**
|
|||
|
|
|||
|
Функция принимает переменное число входных параметров. Параметры могут быть числовых типов, а также `Tuple`, `Array`, `Date`, `DateTime`, `String`.
|
|||
|
|
|||
|
`HLL_precision` — это логарифм по основанию 2 от числа ячеек в [HyperLogLog](https://en.wikipedia.org/wiki/HyperLogLog). Необязательный, можно использовать функцию как `uniqCombined (x [,...])`. Для `HLL_precision` значение по умолчанию — 17, что фактически составляет 96 КБ пространства (2^17 ячеек, 6 бит каждая).
|
|||
|
|
|||
|
**Возвращаемое значение**
|
|||
|
|
|||
|
- Число типа [UInt64](../../../sql-reference/data-types/int-uint.md).
|
|||
|
|
|||
|
**Детали реализации**
|
|||
|
|
|||
|
Функция:
|
|||
|
|
|||
|
- Вычисляет хэш (64-битный для `String` и 32-битный для всех остальных типов) для всех параметров агрегации, а затем использует его в вычислениях.
|
|||
|
|
|||
|
- Используется комбинация трёх алгоритмов: массив, хэш-таблица и HyperLogLog с таблицей коррекции погрешности.
|
|||
|
|
|||
|
Для небольшого количества различных значений используется массив. Если размер набора больше, используется хэш-таблица. При дальнейшем увеличении количества значений, используется структура HyperLogLog, имеющая фиксированный размер в памяти.
|
|||
|
|
|||
|
- Результат детерминирован (не зависит от порядка выполнения запроса).
|
|||
|
|
|||
|
!!! note "Note"
|
|||
|
Так как используется 32-битный хэш для не-`String` типов, результат будет иметь очень очень большую ошибку для количества разичных элементов существенно больше `UINT_MAX` (ошибка быстро растёт начиная с нескольких десятков миллиардов различных значений), таким образом в этом случае нужно использовать [uniqCombined64](#agg_function-uniqcombined64)
|
|||
|
|
|||
|
По сравнению с функцией [uniq](#agg_function-uniq), `uniqCombined`:
|
|||
|
|
|||
|
- Потребляет в несколько раз меньше памяти.
|
|||
|
- Вычисляет с в несколько раз более высокой точностью.
|
|||
|
- Обычно имеет немного более низкую производительность. В некоторых сценариях `uniqCombined` может показывать более высокую производительность, чем `uniq`, например, в случае распределенных запросов, при которых по сети передаётся большое количество состояний агрегации.
|
|||
|
|
|||
|
**Смотрите также**
|
|||
|
|
|||
|
- [uniq](../../../sql-reference/aggregate-functions/reference/uniq.md#agg_function-uniq)
|
|||
|
- [uniqCombined64](../../../sql-reference/aggregate-functions/reference/uniqcombined64.md#agg_function-uniqcombined64)
|
|||
|
- [uniqHLL12](../../../sql-reference/aggregate-functions/reference/uniqhll12.md#agg_function-uniqhll12)
|
|||
|
- [uniqExact](../../../sql-reference/aggregate-functions/reference/uniqexact.md#agg_function-uniqexact)
|