我有多个不同模式的输入源。为了使用clickhouse进行一些分析,我想到了两种处理分析工作负载的方法,使用 join
或者 aggregation
操作:
使用join需要定义一个对应于每个输入的表。
使用聚合函数需要一个表,其中包含一组预定义的列,列数和列类型将基于我的近似值,并且将来可能会更改。
我的问题是:如果我使用第二种方法,定义很多列,比如说几百列。它如何影响性能、存储成本。。。等?
我有多个不同模式的输入源。为了使用clickhouse进行一些分析,我想到了两种处理分析工作负载的方法,使用 join
或者 aggregation
操作:
使用join需要定义一个对应于每个输入的表。
使用聚合函数需要一个表,其中包含一组预定义的列,列数和列类型将基于我的近似值,并且将来可能会更改。
我的问题是:如果我使用第二种方法,定义很多列,比如说几百列。它如何影响性能、存储成本。。。等?
1条答案
按热度按时间scyqe7ek1#
一般来说,一个包含所有值的大表+聚合函数的用法通常是clickhouse设计的用例。
当查询分布在机器之间时,各种类型的基于连接的查询在大型数据集上开始变得高效。但是,如果您有能力将数据保存在单个ssdraid上,请尝试使用单个表和聚合函数。
当然,这是一般的建议,它真的取决于你的数据。
就不规则数据而言,根据其变化程度,您可能希望使用动态解决方案(如spark或elastic search)或支持“稀疏”列的数据库(如cassandra或scylladb)。
如果您想使用clickhouse来实现这一点,可以考虑使用数组和元组来保存它们。
总的来说,clickhouse在压缩数据方面非常聪明,因此添加大量空值应该是可以的(例如,它们几乎不会增加任何查询时间,也不会占用额外的空间)。查询是基于列的,因此如果您不需要特定查询的列,那么性能不会受到所述列存在的简单事实的影响(例如,与rdbms中的一样)。
因此,即使您的表有200列,只要您的查询只使用其中的2列,它的效率基本上与表只有2列一样高。而且,列的粒度越低,对该列的查询速度就越快(有一些警告)。也就是说,如果您计划在同一个查询中查询数百列。。。它可能会走得相当慢,但是clickhouse非常擅长并行化工作,因此,如果您的数据在几十tb(未压缩)以下,那么使用一台带有一些大型ssd和2个xeon的机器通常就可以了。
但是,这在很大程度上取决于数据集,为了得到更有意义的答案,您必须解释您的数据和所需的查询类型。