一文教会你使用强大的ClickHouse物化视图
在现实世界中,数据不仅需要存储,还需要处理。处理通常在应用程序端完成。但是,有些关键的处理点可以转移到ClickHouse,以提高数据的性能和可管理性。ClickHouse中最强大的工具之一就是物化视图。在这篇文章中,我们将探秘物化视图以及它们如何完成加速查询以及数据转换、过滤和路由等任务。 如果您想了解更多关于物化视图的信息,我们后续会提供一个免费的培训课程。 物化视图是一种特殊的触发器,当数据被插入时,它将数据上执行 SELECT 查询的结果存储为到一个目标表中: 在许多情场景下,这都非常有用,让我们看看最受欢迎的一个场景 - 使某些查询更快。 以Wikistat的10亿行数据集为例:
我们可以创建任意数量的物化视图,但每一个新的物化视图都是额外的存储负担,因此保持总数合理,即每个表下的物化视图数目控制在10个以内。 现在,我们使用与 wikistat 表相同的查询来填充物化视图的目标表:
由于 wikistat_top_projects 是一个表,我们可以利用ClickHouse的SQL功能进行查询:
我们可以使用 SHOW TABLES 查询列出物化视图:
所有关于物化视图表的元数据都存储在system数据库中,与其他表一样。例如,为了获取其在磁盘上的大小,我们可以执行以下操作:
物化视图的最强大的特点是当向源表插入数据时,目标表中的数据会使用 SELECT 语句自动更新: 因此,我们不需要额外地刷新物化视图中的数据 - ClickHouse会自动完成一切操作。假设我们向 wikistat 表插入新数据:
如前一节所示,物化视图是一种提高查询性能的方法。对于分析查询,常见的聚合操作不仅仅是前面示例中展示的 sum() 。SummingMergeTree非常适用于计算汇总数据,但还有更高级的聚合可以使用AggregatingMergeTree引擎进行计算。 假设我们经常执行以下类型的查询:
注意,我们的原始数据已经按小时进行了汇总。 我们使用物化视图存储这些聚合结果以便更快地检索。使用状态组合器(state combinators)定义聚合结果。状态组合器要求ClickHouse保存内部聚合状态,而不是最终的聚合结果。这允许使用聚合操作,而无需保存带有原始值的所有记录。这种方法很简单 - 我们在创建物化视图时使用*State()函数,然后在查询时使用其对应的*Merge()函数获取正确的聚合结果: 在我们的示例中,我们将使用 min 、 max 和 avg 状态。在新物化视图的目标表中,我们将使用 AggregateFunction 类型存储聚合状态而不是值:
在某些情况下,我们只需要存储聚合数据,但数据的写入是基于事件的方式进行的。如果我们仍然需要原始数据的最近几天的数据,并且可以保存聚合的历史数据,我们可以结合物化视图和源表的TTL来实现。 为了优化存储空间,我们还可以明确声明列类型,以确保表结构是最优的。假设我们想要仅存储来自 wikistat 表的每个path的月度聚合数据:
|