用途:本资料面向需要在 ClickHouse 中创建 Materialized View(物化视图,MV)的场景,覆盖实时聚合、ETL 数据转换管道与查询优化。适用于对原始明细表做预聚合、解析原始 JSON 日志、跟踪每实体最新状态等任务。
主要能力与关键规则:
- MV 是触发器而非缓存,只处理 INSERT 的数据,不处理查询结果,也不查询历史数据。
- 简单求和与计数用 SummingMergeTree;需要 uniq、quantile 等非可加聚合时用 AggregatingMergeTree。
- 写入用 -State 函数(如 sumState、uniqState、quantileState),查询用 -Merge 函数(如 sumMerge、uniqMerge、quantileMerge)。
- 链式 MV 看到的是上游 MV SELECT 产出的预聚合块,而非目标表的已合并状态,链式 AggregatingMergeTree 需使用 -MergeState(如 sumMergeState、uniqMergeState)。
- 目标表 ORDER BY 必须与 MV 的 GROUP BY 匹配;MV 不能 ALTER,只能 DROP 后重建。
模式示例:实时计数器使用 SummingMergeTree,但 uniq() 在该引擎下不准确;复杂聚合使用 AggregatingMergeTree;数据转换在插入时用 JSONExtractString 解析;最新值追踪用 ReplacingMergeTree(last_seen),查询用 argMax 模式避免 FINAL。
使用方式:先建立源表与目标表,再通过 CREATE MATERIALIZED VIEW ... TO target AS SELECT ... 创建。
限制与注意事项:MV 不处理已有历史数据,需要手动 INSERT 回填;一个源表上 MV 过多会拖慢每次 INSERT;链式与并行拓扑资源消耗几乎相同,应根据查询粒度而非性能假设选择拓扑。
管理:查询 system.tables 中 engine = 'MaterializedView' 可列出 MV;用 ALTER TABLE ... DETACH/ATTACH MATERIALIZED VIEW 暂停或恢复;排错时对比目标表与源表计数、检查 MV 是否附着、ORDER BY 是否匹配。资料强调在创建或修改 MV 与目标表前应获得用户确认。具体版本要求与完整命令示例以原始资料为准。