'distinct'是ClickHouse的普通操作吗?
Is 'distinct' an ordinary operation for ClickHouse?
我想使用 ClickHouse 进行营销。大多数时候,他们不仅想知道有多少人使用某些功能,还想知道向哪些电子邮件发送垃圾邮件。
将 ClickHouse 用于此目的是否是一个不错的选择(select 来自 table 的 DISTINCT 电子邮件...)? 'select COUNT'和'select DISTINCT'在性能上有什么区别?
Is that a good choice to use ClickHouse for such purpose
是的,ClickHouse 有不错的 HashTable 和 Aggregator 实现。它大量使用模板化代码进行静态类型分配,并应用了大量内存技巧。并且它以紧凑的形式存储数据。
我假设您想比较 select count
和 select count(distinct)
,因为 select distinct
是不同的野兽。 ClickHouse 将 count(distinct)
转换为聚合器 uniqExact
,这比 count(*)
慢大约 8 倍,但仍然比 Postgres 等传统数据库快得多。还有近似聚合器 uniq
、uniqCombined
和 uniqHLL12
用于更快的估计,比 count(*)
慢 1.5 倍左右。如果您需要更多信息,请参阅 https://clickhouse.yandex/docs/en/query_language/agg_functions/reference/。
如果你的目标是select distinct
,ClickHouse仍然可以做得很好,它使用Set
数据结构来统一数据流(Set
也用于构建它的SQL in (...)
构造)。在不测量数据输出过程的情况下,它只比普通 count(*)
慢 1.3 倍。
我想使用 ClickHouse 进行营销。大多数时候,他们不仅想知道有多少人使用某些功能,还想知道向哪些电子邮件发送垃圾邮件。 将 ClickHouse 用于此目的是否是一个不错的选择(select 来自 table 的 DISTINCT 电子邮件...)? 'select COUNT'和'select DISTINCT'在性能上有什么区别?
Is that a good choice to use ClickHouse for such purpose
是的,ClickHouse 有不错的 HashTable 和 Aggregator 实现。它大量使用模板化代码进行静态类型分配,并应用了大量内存技巧。并且它以紧凑的形式存储数据。
我假设您想比较 select count
和 select count(distinct)
,因为 select distinct
是不同的野兽。 ClickHouse 将 count(distinct)
转换为聚合器 uniqExact
,这比 count(*)
慢大约 8 倍,但仍然比 Postgres 等传统数据库快得多。还有近似聚合器 uniq
、uniqCombined
和 uniqHLL12
用于更快的估计,比 count(*)
慢 1.5 倍左右。如果您需要更多信息,请参阅 https://clickhouse.yandex/docs/en/query_language/agg_functions/reference/。
如果你的目标是select distinct
,ClickHouse仍然可以做得很好,它使用Set
数据结构来统一数据流(Set
也用于构建它的SQL in (...)
构造)。在不测量数据输出过程的情况下,它只比普通 count(*)
慢 1.3 倍。