跳到主要内容
跳到主要内容

count

计算行数或非NULL值的数量。

ClickHouse支持以下count的语法:

  • count(expr)COUNT(DISTINCT expr)
  • count()COUNT(*)count()语法是ClickHouse特有的。

参数

该函数可以接受:

返回值

  • 如果函数不带参数调用,则计算行数。
  • 如果传递了表达式,则函数计算该表达式返回非NULL的次数。如果该表达式返回Nullable类型的值,则count的结果保持为非Nullable。如果该表达式对于所有行返回NULL,则函数返回0。

在这两种情况下,返回值的类型为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子句,因为这可以改善并行化。你也可以使用projection在用于COUNT(DISTINCT target_col)的目标列上创建索引。

示例

示例 1:

SELECT count() FROM t
┌─count()─┐
│       5 │
└─────────┘

示例 2:

SELECT name, value FROM system.settings WHERE name = 'count_distinct_implementation'
┌─name──────────────────────────┬─value─────┐
│ count_distinct_implementation │ uniqExact │
└───────────────────────────────┴───────────┘
SELECT count(DISTINCT num) FROM t
┌─uniqExact(num)─┐
│              3 │
└────────────────┘

此示例显示count(DISTINCT num)是根据count_distinct_implementation设置值通过uniqExact函数执行的。