1

我有多个不同模式的输入源。为了使用 Clickhouse 进行一些分析,我想到了两种处理分析工作负载的方法,使用joinaggregation操作:

  1. 使用连接涉及定义与每个输入对应的表。

  2. 使用聚合函数需要一个表,其中包含一组预定义的列,列的数量和列的类型将基于我的近似值,并且将来可能会改变。

我的问题是:如果我采用第二种方法,定义很多列,比如说数百列。它如何影响性能、存储成本……等?

4

1 回答 1

5

一般来说,一个包含所有值的大表 + 聚合函数的使用通常是 clickhouse 设计的用例。

当查询分布在机器之间时,各种类型的基于连接的查询开始在大型数据集上变得高效。但是,如果您有能力将数据保存在单个 SSD RAID 上,请尝试使用单个表和聚合函数。

当然,这是一般建议,它实际上取决于您的数据。

就不规则数据而言,根据它的变化程度,您可能需要考虑使用动态解决方案(例如 Spark 或 Elastic Search)或支持“稀疏”列的数据库(例如 Cassandra 或 ScyllaDb)。

如果您想为此使用 Clickhouse,请考虑使用数组和元组来保存它们。

总的来说,clickhouse 在压缩数据方面非常聪明,所以添加很多空值应该没问题(例如,它们几乎不会增加查询时间,也不会占用额外的空间)。查询是基于列的,因此如果您不需要特定查询的列,则性能不会受到所述列存在的简单事实的影响(例如,就像在 RDBMS 中一样)。

因此,即使您的表有 200 列,只要您的查询只使用其中 2 列,它基本上与表只有 2 列一样有效。此外,列的粒度越低,对该列的查询就越快(有一些警告)。话虽这么说,如果您计划在同一个查询中查询数百个列......它可能会变得相当慢,但 clickhouse 非常擅长并行化工作,所以如果您的数据在几十个 Tb 的较低(未压缩) ,获得一台带有一些大型 SSD 和 2 个 Xeon 的机器通常可以解决问题。

但是,这一切都在很大程度上取决于数据集,您必须解释您的数据和您需要的查询类型才能获得更有意义的答案。

于 2018-05-26T13:01:56.647 回答