ClickHouse 物化视图实践中的坑
2023-11-16 10:09:34
物化视图作为 ClickHouse 中提速查询利器,虽能显著提升查询效率,但使用过程中仍难免踩坑。本文将分享我们在使用 ClickHouse 物化视图时遇到的问题及解决方案,希望对广大 ClickHouse 用户有所帮助。
踩坑实录
场景简介
我们线上业务中有一张名为 base_detail
的基础表,其数据量较大,涉及到多表关联查询。由于该表的查询时间经常超过 1 秒,为了提升查询效率,我们决定在 base_detail
表上创建一个物化视图。
物化视图的创建语句如下:
CREATE MATERIALIZED VIEW mat_base_detail AS
SELECT
id,
t,
SUM(value) AS total_value
FROM
base_detail
GROUP BY
id,
t;
踩坑点 1:物化视图刷新异常
物化视图创建成功后,我们对其进行了刷新操作。然而,刷新过程却报出了如下错误:
Code: 212. DB::Exception: Table not found.
经过一番排查,我们发现错误的原因是物化视图的依赖表(即 base_detail
表)不存在。由于我们创建物化视图时删除了部分细节,导致依赖表信息缺失。
解决方案
针对该问题,我们重新创建了物化视图,并显式指定了依赖表:
CREATE MATERIALIZED VIEW mat_base_detail AS
SELECT
id,
t,
SUM(value) AS total_value
FROM
base_detail
GROUP BY
id,
t;
ON CLUSTER base;
通过显式指定依赖表,ClickHouse 可以在刷新物化视图时正确地找到依赖表,从而避免了表不存在的错误。
踩坑点 2:物化视图更新延迟
创建物化视图后,我们发现物化视图的数据更新延迟较高。这意味着基础表数据更新后,物化视图中的数据并没有及时更新。
解决方案
针对物化视图更新延迟的问题,我们通过以下方法进行了优化:
- 缩短物化视图刷新间隔: 将物化视图的刷新间隔从默认的 24 小时缩短为 1 小时。
- 使用异步刷新: 将物化视图的刷新模式从同步刷新改为异步刷新。这样,物化视图的刷新不会阻塞基础表的查询。
- 使用后台刷新: 启用物化视图的后台刷新功能。这样,物化视图可以在后台进行刷新,而不会影响在线查询。
通过上述优化,我们有效地降低了物化视图的更新延迟,使物化视图中的数据能够及时更新。
踩坑点 3:物化视图查询性能不佳
尽管创建了物化视图,但我们发现某些查询在物化视图上执行的性能并不理想。
经过分析,我们发现原因是物化视图的聚合列太多。由于我们的物化视图聚合了 id
和 t
两个列,导致在某些查询中,物化视图需要进行大量的分组操作,从而影响了查询性能。
解决方案
为了解决该问题,我们对物化视图进行了重构,将聚合列减少到了只聚合 id
一列:
CREATE MATERIALIZED VIEW mat_base_detail AS
SELECT
id,
SUM(value) AS total_value
FROM
base_detail
GROUP BY
id;
通过减少聚合列的数量,我们优化了物化视图的查询性能,使其在更多查询场景下都能发挥提速作用。
经验总结
通过对上述踩坑问题的分析和解决,我们总结了一些使用 ClickHouse 物化视图的经验:
- 明确依赖关系: 创建物化视图时,要明确指定其依赖的表,避免表不存在导致的错误。
- 优化刷新策略: 根据业务需求,对物化视图的刷新间隔、刷新模式和后台刷新功能进行优化,以保证物化视图数据的及时更新。
- 合理设计聚合列: 根据查询需求,合理设计物化视图的聚合列,避免过多的聚合列影响查询性能。
- 定期监控: 定期监控物化视图的性能和更新情况,及时发现并解决潜在问题。
遵循这些经验,可以帮助 ClickHouse 用户充分发挥物化视图的提速作用,为查询优化工作提供有力支撑。