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

count

Считывает количество строк или ненулевых значений.

ClickHouse поддерживает следующие синтаксисы для count:

  • count(expr) или COUNT(DISTINCT expr).
  • count() или COUNT(*). Синтаксис count() специфичен для ClickHouse.

Аргументы

Функция может принимать:

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

  • Если функция вызывается без параметров, она считает количество строк.
  • Если передано выражение, то функция считает, сколько раз это выражение вернуло ненулевое значение. Если выражение возвращает значение типа Nullable, то результат count остается не Nullable. Функция возвращает 0, если выражение вернуло NULL для всех строк.

В обоих случаях тип возвращаемого значения — UInt64.

Детали

ClickHouse поддерживает синтаксис COUNT(DISTINCT ...). Поведение этой конструкции зависит от настройки count_distinct_implementation. Она определяет, какая из uniq* функций используется для выполнения операции. По умолчанию используется функция uniqExact.

Запрос SELECT count() FROM table по умолчанию оптимизируется с использованием метаданных из MergeTree. Если вам нужно использовать безопасность на уровне строк, отключите оптимизацию с помощью настройки 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.