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