count
Считывает количество строк или ненулевых значений.
ClickHouse поддерживает следующую синтаксисы для count
:
count(expr)
илиCOUNT(DISTINCT expr)
.count()
илиCOUNT(*)
. Синтаксисcount()
является специфичным для ClickHouse.
Аргументы
Функция может принимать:
- Ноль параметров.
- Одно выражение.
Возвращаемое значение
- Если функция вызывается без параметров, она считает количество строк.
- Если передано выражение, то функция считает, сколько раз это выражение вернуло ненулевое значение. Если выражение возвращает значение типа Nullable, то результат
count
остается ненулевым. Функция возвращает 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
.