背景:
表A日更数据量5亿,表B周更表80亿
需求可查询近一年的数据,查询范围为一个月

在处理表A和表B的关联查询时,遇到了clickhouse join能力差的问题。根据官方文档,不推荐使用inner join语法。

原始思路是直接进行关联查询,但是由于数据量庞大,执行速度非常慢甚至卡住。为了解决这个问题,尝试了以下几种优化方案:

思路一:先查询出表A中符合条件的主键数据,将其拼接成一个列表,然后使用表B进行in操作,查出符合条件的结果集。然而,在预发布环境中发现问题,当表A某主键查出的数据量过多时,in操作会报错或者查询时间过长。这时尝试使用子查询的方式进行查询,例如:select * from B where id in (select bid from A where id = ‘xx’),但仍然遇到卡顿和超时的问题。

优化一:增加机器数量,将两台机器加入集群中,变成4分片2主副结构。然而,性能仍然很慢。

优化二:经过领导指示,将近一年的2000亿数据与80亿的数据进行join关联。发现真正活跃的设备数只有15亿左右,于是将这部分数据存储到近hdfs中。调研后发现,当in操作的数据量达到三四十万时,4分片2主副结构仍然很慢。于是尝试了另一个思路,不再使用副本,而是使用8个分片,并行查询的能力。结果表明,在一台机器上处理2亿左右的数据量,表B in 三四十万的数据只需要大约2秒的时间,偶尔可能会达到10秒左右,但总体上比报错要好得多。

通过以上优化措施,成功提升了clickhouse在处理2000亿数据的性能。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐