clickhouse 架构设计,预定义的列集
clickhouse schema design, predefined set of columns
我有多个不同模式的输入源。为了使用 Clickhouse 进行一些分析,我想到了两种处理分析工作负载的方法,使用 join
或 aggregation
操作:
使用 join 涉及定义与每个输入相对应的 table。
使用聚合函数需要单个 table,具有一组预定义的列,列数和列类型将基于我的近似值,并且可能会更改未来。
我的问题是:如果我采用第二种方法,定义很多列比方说一百列。它如何影响性能、存储成本...等?
一般来说,包含所有值的大型 table + 使用聚合函数通常是设计 clickhouse 的用例。
当查询分布在机器之间时,各种类型的基于连接的查询开始在大型数据集上变得高效。但是,如果您有能力将数据保存在单个 SSD RAID 上,请尝试使用单个 table 和聚合函数。
当然,这是一般性建议,具体取决于您的数据。
就不规则数据而言,取决于它的变化程度,您可能需要考虑使用动态解决方案(例如 Spark 或 Elastic Search)或支持 "sparse" 列的数据库(例如Cassandra 或 ScyllaDb)。
如果你想为此使用 Clickhouse,请考虑使用数组和元组来保存它们。
总的来说,clickhouse 在压缩数据方面非常聪明,所以添加很多空值应该没问题(例如,它们几乎不会增加查询时间,也不会占用额外的空间 space) .查询是基于列的,因此如果您不需要特定查询的列,性能将不会受到列存在这一简单事实的影响(例如,就像在 RDBMS 中一样)。
因此,即使您的 table 有 200 列,只要您的查询仅使用其中的 2 列,它的效率基本上就好像 table 只有 2 列一样列。此外,列的粒度越低,对该列的查询越快(有一些注意事项)。话虽这么说,如果您计划在同一个查询中查询数百列......它可能会变得相当慢,但是 clickhouse 非常擅长并行化工作,所以如果您的数据在几十 Tb(未压缩)以下, 获得一台配备一些大型 SSD 和 2 个至强处理器的机器通常就可以解决问题。
但是,同样,这一切都在很大程度上取决于数据集,您必须解释您的数据和您需要的查询类型才能获得更有意义的答案。
我有多个不同模式的输入源。为了使用 Clickhouse 进行一些分析,我想到了两种处理分析工作负载的方法,使用 join
或 aggregation
操作:
使用 join 涉及定义与每个输入相对应的 table。
使用聚合函数需要单个 table,具有一组预定义的列,列数和列类型将基于我的近似值,并且可能会更改未来。
我的问题是:如果我采用第二种方法,定义很多列比方说一百列。它如何影响性能、存储成本...等?
一般来说,包含所有值的大型 table + 使用聚合函数通常是设计 clickhouse 的用例。
当查询分布在机器之间时,各种类型的基于连接的查询开始在大型数据集上变得高效。但是,如果您有能力将数据保存在单个 SSD RAID 上,请尝试使用单个 table 和聚合函数。
当然,这是一般性建议,具体取决于您的数据。
就不规则数据而言,取决于它的变化程度,您可能需要考虑使用动态解决方案(例如 Spark 或 Elastic Search)或支持 "sparse" 列的数据库(例如Cassandra 或 ScyllaDb)。
如果你想为此使用 Clickhouse,请考虑使用数组和元组来保存它们。
总的来说,clickhouse 在压缩数据方面非常聪明,所以添加很多空值应该没问题(例如,它们几乎不会增加查询时间,也不会占用额外的空间 space) .查询是基于列的,因此如果您不需要特定查询的列,性能将不会受到列存在这一简单事实的影响(例如,就像在 RDBMS 中一样)。
因此,即使您的 table 有 200 列,只要您的查询仅使用其中的 2 列,它的效率基本上就好像 table 只有 2 列一样列。此外,列的粒度越低,对该列的查询越快(有一些注意事项)。话虽这么说,如果您计划在同一个查询中查询数百列......它可能会变得相当慢,但是 clickhouse 非常擅长并行化工作,所以如果您的数据在几十 Tb(未压缩)以下, 获得一台配备一些大型 SSD 和 2 个至强处理器的机器通常就可以解决问题。
但是,同样,这一切都在很大程度上取决于数据集,您必须解释您的数据和您需要的查询类型才能获得更有意义的答案。