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函数执行的。