Replacing、Summing、Aggregating、Collapsing和VersionedCollapsingMergeTree的区别和使用场景

建议先关注、点赞、收藏后再阅读。

ReplacingMergeTree和SummingMergeTree是ClickHouse中两种常用的MergeTree引擎。

它们之间的主要区别如下:

1. ReplacingMergeTree:

  • 使用该引擎的表支持重复数据的替换和删除。
  • 数据写入时,新的数据将会替换掉已有的相同数据。
  • 可以通过设置设置ttl删除数据,已被替换的数据将被保留在表中并不会真正删除。

2. SummingMergeTree:

  • 使用该引擎的表支持按照某个列进行聚合计算。
  • 需要指定一个进行聚合的列,并指定该列的数据类型。
  • 当新数据写入时,相同键的值会被相加。
  • 聚合列的值只能是数字(Int32、Int64、Float32、Float64)类型。

选择使用其中之一取决于具体的业务需求:

  • 如果需要对某一列进行聚合计算,并且希望保留历史数据,则可以选择SummingMergeTree。
  • 如果需要对数据进行替换或删除,并且不需要进行聚合计算,则可以选择ReplacingMergeTree。

请注意:以上仅为一般情况下的选择建议,实际选择需要根据具体的业务需求和数据处理方式进行衡量。

在ClickHouse的AggregatingMergeTree中,数据是通过在多个分布式节点上进行预聚合操作来进行聚合的。

它使用了分层的存储策略,其中每个层级都存储了不同程度的聚合结果。

具体来说,数据在AggregatingMergeTree中按照指定的维度进行分割,并在每个分片中维护了一个聚合树。聚合树是一种树状结构,其中每个节点都包含了聚合操作的结果。当有新的数据插入时,会在聚合树中找到相应的节点并进行更新。当查询时,可以通过在聚合树中的节点上进行算术操作来获取聚合结果。

举个例子来说明它的用途。假设我们有一个电商网站,需要对用户的购买记录进行聚合分析。我们可以使用AggregatingMergeTree将数据按照用户ID进行分割,并对每个用户的购买金额进行预聚合。

首先,在创建表时,我们定义了需要聚合的列(比如购买金额)以及维度列(比如用户ID)。然后,我们可以使用INSERT语句将用户的购买记录插入到表中。

当有新的购买记录插入时,AggregatingMergeTree会将新数据插入到对应的分片中,并在聚合树中更新相应的节点。这样,我们可以通过查询表来获取某个用户的购买总金额,或者按照时间范围进行聚合分析。

对于上述的电商网站的例子,我们可以使用如下的SQL查询来获取每个用户的购买总金额:

代码语言:sql
复制
SELECT userId, sum(purchaseAmount) as totalAmount
FROM purchase_records
GROUP BY userId

AggregatingMergeTree的优势在于,它可以高效地处理大量的数据,并且支持实时查询,使得分析和报表生成更加方便快捷。同时,它还支持数据的压缩和分布式部署,可以满足大规模数据存储和处理的需求。

CollapsingMergeTree

CollapsingMergeTree 是 ClickHouse 数据库中的一种表引擎。它基于 MergeTree,并在此基础上添加了合并时去除重复数据的功能。当插入新数据时,如果某条数据的 Primary Key(主键)与已有数据重复,那么它将取代已有数据(该条记录以前的所有副本都会被删除),从而保持表中任意时刻只有一份最新的数据。

VersionedCollapsingMergeTree

VersionedCollapsingMergeTree 同样是基于 MergeTree,它在 CollapsingMergeTree 的基础上增加了版本控制的功能。每当一个数据被更新,它会创建一个新版本。这使得在查询时可以跟踪数据的历史状态,而不仅仅是最新版本。

使用场景

选择使用 VersionedCollapsingMergeTree 可以在需要跟踪数据历史变化的情况下提供更大的灵活性。例如,在数据集合中,如果需要保留数据集合的所有历史版本,并能根据需要查询和分析过去的数据,那么 VersionedCollapsingMergeTree 是一个更合适的选择。此外,如果需要对数据集合进行更复杂的时间段查询、追溯数据订购号或速率更改等场景,也可以选择使用 VersionedCollapsingMergeTree。

总而言之,VersionedCollapsingMergeTree 适用于需要在查询中跟踪数据历史变化的场景,而 CollapsingMergeTree 则更适用于只需保留最新数据的场景。