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:
示例 2:
此示例显示count(DISTINCT num)
是根据count_distinct_implementation
设置值通过uniqExact
函数执行的。