| Data storage and location | Store their results in a separate, explicit target table, acting as insert triggers, on insert to a source table. | Projections create optimized data layouts that are physically stored alongside the main table data and are invisible to the user. |
| Update mechanism | Operate synchronously on INSERT to the source table (for incremental materialized views). Note: they can also be scheduled using refreshable materialized views. | Asynchronous updates in the background upon INSERT to the main table. |
| Query interaction | Working with Materialized Views requires querying the target table directly, meaning that you need to be aware of the existence of materialized views when writing queries. | Projections are automatically selected by ClickHouse’s query optimizer, and are transparent in the sense that the user doesn’t have to modify their queries to the table with the projection in order to utilise it. From version 25.6 it is also possible to filter by more than one projection. |
Handling UPDATE / DELETE | Don’t automatically react to UPDATE or DELETE operations on the source table as materialized views have no knowledge of the source table, acting only as insert triggers to a source table. This can lead to potential data staleness between source and target tables and requires workarounds or periodic full refresh. (via refreshable materialized view). | By default, are incompatible with DELETED rows (especially lightweight deletes). lightweight_mutation_projection_mode (v24.7+) can enable compatibility. |
JOIN support | Yes. Refreshable materialized views can be used for complex denormalization. Incremental materialized views only trigger on left-most table inserts. | No. JOIN operations aren’t supported within projection definitions for filtering the materialized data. However, queries that join tables with projections work normally—projections optimize individual table access. |
WHERE clause in definition | Yes. WHERE clauses can be included to filter data before materialization. | No. WHERE clauses aren’t supported within projection definitions for filtering the materialized data. |
| Chaining capabilities | Yes, the target table of one materialized view can be the source for another materialized view, enabling multi-stage pipelines. | No. Projections can’t be chained. |
| Applicable table engines | Can be used with various source table engines, but target tables are usually of the MergeTree family. | Only available for MergeTree family table engines. |
| Failure handling | Failure during data insertion means that data is lost in the target table, leading to potential inconsistency. | Failures are handled silently in the background. Queries can seamlessly mix materialized and unmaterialized parts. |
| Operational overhead | Requires explicit target table creation and often manual backfilling. Managing consistency with UPDATE/DELETE increases complexity. | Projections are automatically maintained and kept-in-sync and generally have a lower operational burden. |
FINAL query compatibility | Generally compatible, but often require GROUP BY on the target table. | Don’t work with FINAL queries. |
| Lazy materialization | Yes. | Monitor for projection compatibility issues when using materialization features. You may need to set query_plan_optimize_lazy_materialization = false |
| Parallel replicas | Yes. | No. |
optimize_read_in_order | Yes. | Yes. |
| Lightweight updates and deletes | Yes. | No. |