我有多个输入源,使用不同的模式。要使用Clickhouse进行一些分析,我使用WorkingDirectory
或join
操作处理分析工作负载的两种方法:
使用join涉及定义与每个输入对应的表。
使用聚合函数需要一个表,其中包含一组预定义的列,列的数量和列的类型将基于我的近似值,并且将来可能会更改。
< / LI> 醇>我的问题是:如果我采用第二种方法,定义很多列,就可以说数百列。它如何影响性能,存储成本......等等?
答案 0 :(得分:2)
一般来说,包含所有值的大表+聚合函数的使用通常是设计clickhouse的用例。
当查询在计算机之间分发时,各种类型的基于联接的查询在大型数据集上开始有效。但是,如果您能够将数据保存在单个SSD RAID上,请尝试使用单个表和聚合函数。
当然,这是一般性建议,它实际上取决于您的数据。
就不规则数据而言,取决于它的变化程度,您可能希望研究使用动态解决方案(例如Spark或Elastic Search)或支持“稀疏”列的数据库(例如Cassandra或ScyllaDb)
如果你想使用Clickhouse,请考虑使用数组和元组来保存它们。
总的来说,clickhouse非常聪明地压缩数据,因此添加大量空值应该没问题(例如,它们几乎不会增加查询时间,也不会占用额外的空间)。查询是基于列的,因此如果您不需要特定查询的列,则性能不会受到所述列存在的简单事实的影响(例如,它将在RDBMS中)。
因此,即使您的表有200列,只要您的查询仅使用其中的2列,它基本上就像表只有2列一样有效。此外,列的粒度越低,对该列的查询越快(有一些警告)。话虽这么说,如果你打算在同一个查询中查询数百个列...它可能会相当慢,但是clickhouse非常擅长并行化工作,所以如果你的数据是低于几十个Tb(未压缩)使用一些大型SSD和2个Xeon的机器通常可以解决这个问题。
但是,再次,这一切都在很大程度上取决于数据集,您必须解释您的数据和所需的查询类型,以获得更有意义的答案。