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
.