| 数据存储与位置 | 将结果存储在单独、显式指定的目标表中,并在向源表执行 INSERT 时充当插入触发器。 | 投影会创建优化的数据布局,并在物理上与主表数据一同存储,对用户不可见。 |
| 更新机制 | 对源表的 INSERT 同步执行 (对于增量materialized view) 。注意:也可以通过可刷新materialized view 按计划定期刷新。 | 在向主表 INSERT 后于后台进行异步更新。 |
| 查询交互 | 使用 Materialized Views 时,需要直接查询目标表,这意味着你在编写查询时必须知道 materialized view 的存在。 | 投影由 ClickHouse 的查询优化器自动选择,也就是说对用户是透明的;用户无需修改针对带有投影的表的查询即可利用它。从 25.6 版本开始,还可以按多个投影进行过滤。 |
处理 UPDATE / DELETE | 对源表上的 UPDATE 或 DELETE 操作不会自动响应,因为 materialized view 并不了解源表,只会在向源表插入时充当插入触发器。这可能导致源表与目标表之间的数据变陈旧,并需要变通方案或定期全量刷新 (通过可刷新materialized view) 。 | 默认情况下,与已 DELETED 的行不兼容 (尤其是轻量级删除) 。lightweight_mutation_projection_mode (v24.7+) 可启用兼容性。 |
JOIN 支持 | 是。可刷新materialized view 可用于复杂的反规范化。增量materialized view 仅会在最左侧表插入时触发。 | 否。投影定义中不支持用 JOIN 操作过滤已 materialized 的数据。不过,连接带有投影的表的查询仍可正常工作——投影优化的是各个表的访问。 |
定义中的 WHERE 子句 | 是。可以包含 WHERE 子句,以便在 materialization 之前过滤数据。 | 否。投影定义中不支持用 WHERE 子句过滤已 materialized 的数据。 |
| 链式能力 | 是。一个 materialized view 的目标表可以作为另一个 materialized view 的源,从而支持多阶段管道。 | 否。投影不能链式使用。 |
| 适用的表引擎 | 可用于多种源表引擎,但目标表通常属于 MergeTree 家族。 | 仅适用于 MergeTree 家族表引擎。 |
| 故障处理 | 数据插入期间发生故障意味着目标表中的数据会丢失,从而可能导致不一致。 | 故障会在后台被静默处理。查询可以无缝混合已 materialized 和未 materialized 的 parts。 |
| 运维开销 | 需要显式创建目标表,而且通常需要手动回填。维护与 UPDATE/DELETE 相关的一致性会增加复杂性。 | 投影会自动维护并保持同步,通常运维负担更低。 |
FINAL 查询兼容性 | 通常兼容,但往往需要在目标表上使用 GROUP BY。 | 不适用于 FINAL 查询。 |
| 延迟 materialization | 是。 | 使用 materialization 功能时,请注意投影兼容性问题。你可能需要设置 query_plan_optimize_lazy_materialization = false |
| 并行副本 | 是。 | 否。 |
optimize_read_in_order | 是。 | 是。 |
| 轻量级更新和删除 | 是。 | 否。 |