count
Подсчитывает количество строк или значений, отличных от NULL.
ClickHouse поддерживает следующие варианты синтаксиса для count:
count(expr)илиCOUNT(DISTINCT expr).count()илиCOUNT(*). Синтаксисcount()специфичен для ClickHouse.
Аргументы
Функция может принимать:
- Ноль параметров.
- Одно выражение.
Возвращаемое значение
- Если функция вызывается без параметров, она подсчитывает количество строк.
- Если передано выражение, то функция считает, сколько раз это выражение вернуло не NULL. Если выражение возвращает значение типа Nullable, то результат
countостаётся типом, неNullable. Функция возвращает 0, если выражение вернулоNULLдля всех строк.
В обоих случаях тип возвращаемого значения — UInt64.
Подробности
ClickHouse поддерживает синтаксис COUNT(DISTINCT ...). Поведение этой конструкции зависит от настройки count_distinct_implementation. Она определяет, какая из функций семейства uniq* используется для выполнения операции. По умолчанию используется функция uniqExact.
Запрос SELECT count() FROM table по умолчанию оптимизируется с использованием метаданных из MergeTree. Если вам нужно использовать построчную безопасность (row-level security), отключите эту оптимизацию с помощью настройки optimize_trivial_count_query.
Однако запрос SELECT count(nullable_column) FROM table может быть оптимизирован путём включения настройки optimize_functions_to_subcolumns. При optimize_functions_to_subcolumns = 1 функция читает только подстолбец null вместо чтения и обработки всех данных столбца. Запрос SELECT count(n) FROM table преобразуется в SELECT sum(NOT n.null) FROM table.
Повышение производительности COUNT(DISTINCT expr)
Если ваш запрос COUNT(DISTINCT expr) выполняется медленно, рассмотрите возможность добавления предложения GROUP BY, так как это улучшает распараллеливание. Вы также можете использовать проекцию для создания индекса по целевому столбцу, используемому с COUNT(DISTINCT target_col).
Примеры
Пример 1:
Пример 2:
Этот пример показывает, что count(DISTINCT num) вычисляется функцией uniqExact в соответствии со значением настройки count_distinct_implementation.