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
子句,因为这可以提高并行化。你也可以使用 投影 为目标列创建一个索引,该目标列与 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
函数执行的。