Skip to main content
A common question from users is when they should use materialized views versus projections. In this article we will explore the key differences between the two and why you may want to pick one over the other in certain scenarios.

Summary of key differences

The table below summarizes the key differences between materialized views and projections for various aspects of consideration.

Comparing materialized views and projections

When to choose materialized views

You should consider using materialized views when:
  • Working with real-time ETL & multi-stage data pipelines: You need to perform complex transformations, aggregations, or to route data as it arrives, potentially across multiple stages by chaining views.
  • You require complex denormalization: You need to pre-join data from several sources (tables, subqueries or dictionaries) into a single, query-optimized table, especially if periodic full refreshes with the use of refreshable materialized views are acceptable.
  • You want explicit schema control: You require a separate, distinct target table with its own schema and engine for the pre-computed results, offering greater flexibility for data modelling.
  • You want to filter at ingestion: You need to filter data before it’s materialized, reducing the volume of data written to the target table.

When to avoid materialized views

You should consider avoiding use of materialized views when:
  • Source data is frequently updated or deleted: Without additional strategies for handling consistency between the source and target tables, incremental materialized views could become stale and inconsistent.
  • Simplicity and automatic optimization are preferred: If you want to avoid managing separate target tables.

When to choose projections

You should consider using projections when:
  • Optimizing queries for a single table: Your primary goal is to speed up queries on a single base table by providing alternative sorting orders, optimizing filters on columns which aren’t part of the primary-key, or pre-computing aggregations for a single table.
  • You want query transparency: you want queries to target the original table without modification, relying on ClickHouse to pick the best data layout for a given query.

When to avoid projections

You should consider avoiding the use of projections when:
  • Complex data transformation or multi-stage ETL are required: Projection definitions don’t support JOIN operations, can’t be chained to build multi-step pipelines, and can’t handle some SQL features like window functions or complex CASE statements. While queries on tables with projections can join freely, the projections themselves aren’t suited for complex data transformation.
  • Explicit filtering of materialized data is needed: Projections don’t support WHERE clauses in their definition to filter the data that gets materialized into the projection itself.
  • Non-MergeTree table engines are used: Projections are exclusively available for tables using the MergeTree family of engines.
  • FINAL queries are essential: Projections don’t work with FINAL queries, which are sometimes used for deduplication.
  • You need parallel replicas as they’re not supported with projections.

Summary

Materialized views and projections are both powerful tools in your toolkit for optimizing queries and transforming data, and in general, we recommend not to view using them as an either/or choice. Instead, they can be used in a complementary manner to get the most out of your queries. As such, the choice between materialized views and projections in ClickHouse really depends on your specific use case and access patterns. As a general rule of thumb, you should consider using materialized views when you need to aggregate data from one or more source tables into a target table or perform complex transformations at scale. Materialized views are excellent for shifting the work of expensive aggregations from query time to insert time. They’re a great choice for daily or monthly rollups, real-time dashboards or data summaries. On the other hand, you should use projections when you need to optimize queries which filter on different columns than those which are used in the table’s primary key which determines the physical ordering of the data on disk. They’re particularly useful when it’s no longer possible to change the primary key of a table, or when your access patterns are more diverse than what the primary key can accommodate.
Last modified on July 2, 2026