Перейти к основному содержанию
Пользователи часто спрашивают, когда следует использовать Materialized views, а когда — проекции. В этой статье мы рассмотрим ключевые различия между ними и объясним, почему в одних сценариях стоит выбрать одно, а в других — другое.

Сводка ключевых различий

В таблице ниже кратко приведены основные различия между materialized views и проекциями по разным аспектам.

Сравнение materialized views и проекций

Когда стоит выбирать materialized views

Вам стоит рассмотреть использование materialized views, если:
  • Вы работаете с ETL в реальном времени и многоэтапными конвейерами данных: вам нужно выполнять сложные преобразования, агрегации или направлять данные по мере их поступления, в том числе через несколько этапов, выстраивая цепочку представлений.
  • Вам нужна сложная денормализация: вам нужно заранее объединить данные из нескольких источников (таблиц, подзапросов или словарей) в одну таблицу, оптимизированную для запросов, особенно если допустимы периодические полные обновления с использованием refreshable materialized views.
  • Вам нужен явный контроль над схемой: вам нужна отдельная, обособленная целевая таблица с собственной схемой и движком для хранения предварительно вычисленных результатов, что даёт больше гибкости при моделировании данных.
  • Вы хотите фильтровать на этапе ингестии: вам нужно фильтровать данные до их материализации, уменьшая объём данных, записываемых в целевую таблицу.

Когда не стоит использовать materialized view

Стоит отказаться от использования materialized view в следующих случаях:
  • Исходные данные часто обновляются или удаляются: без дополнительных механизмов, обеспечивающих согласованность между исходной и целевой таблицами, incremental materialized views могут устаревать и становиться несогласованными.
  • В приоритете простота и автоматическая оптимизация: если вы не хотите управлять отдельными целевыми таблицами.

Когда стоит выбирать проекции

Проекции стоит использовать в следующих случаях:
  • Оптимизация запросов к одной таблице: ваша основная цель — ускорить запросы к одной базовой таблице за счёт альтернативных порядков сортировки, оптимизации фильтров по столбцам, не входящим в первичный ключ, или предварительного вычисления агрегаций для одной таблицы.
  • Вам нужна прозрачность запросов: вы хотите, чтобы запросы без изменений выполнялись к исходной таблице, а ClickHouse сам выбирал оптимальную структуру данных для конкретного запроса.

Когда следует избегать проекций

Следует избегать использования проекций в следующих случаях:
  • Требуются сложные преобразования данных или многоэтапный ETL: определения проекций не поддерживают операции JOIN, их нельзя выстраивать в цепочку для создания многошаговых конвейеров, и они не поддерживают некоторые возможности SQL, такие как оконные функции или сложные выражения CASE. Хотя запросы к таблицам с проекциями могут свободно использовать JOIN, сами проекции не подходят для сложных преобразований данных.
  • Требуется явная фильтрация материализованных данных: проекции не поддерживают секции WHERE в своих определениях для фильтрации данных, которые материализуются в саму проекцию.
  • Используются движки таблиц, отличные от MergeTree: проекции доступны только для таблиц, использующих семейство движков MergeTree.
  • FINAL-запросы критически важны: проекции не работают с запросами FINAL, которые иногда используются для дедупликации.
  • Вам нужны параллельные реплики, так как проекции их не поддерживают.

Краткое резюме

Materialized views и проекции — это мощные инструменты для оптимизации запросов и преобразования данных, и в целом мы рекомендуем не рассматривать их как взаимоисключающие варианты. Напротив, их можно использовать совместно, чтобы получить максимум от ваших запросов. Поэтому выбор между materialized views и проекциями в ClickHouse в первую очередь зависит от вашего конкретного сценария использования и характера доступа к данным. В качестве общего практического правила стоит рассмотреть использование materialized views, когда вам нужно агрегировать данные из одной или нескольких исходных таблиц в целевую таблицу или выполнять сложные преобразования в большом масштабе. Materialized views отлично подходят для переноса ресурсоёмких агрегаций с этапа выполнения запроса на этап вставки данных. Это хороший выбор для ежедневных или ежемесячных rollup, панелей мониторинга в реальном времени и сводных данных. С другой стороны, проекции стоит использовать, когда нужно оптимизировать запросы, которые фильтруют по другим столбцам, а не по тем, которые входят в первичный ключ таблицы и определяют физический порядок данных на диске. Они особенно полезны, когда изменить первичный ключ таблицы уже невозможно или когда характер доступа к данным более разнообразен, чем может охватить первичный ключ.
Последнее изменение 1 июля 2026 г.