| Хранение и расположение данных | Хранят результаты в отдельной, явной целевой таблице и работают как insert triggers при вставке в исходную таблицу. | Проекции создают оптимизированные структуры данных, которые физически хранятся вместе с данными основной таблицы и невидимы для пользователя. |
| Механизм обновления | Работают синхронно при INSERT в исходную таблицу (для incremental materialized views). Примечание: их также можно обновлять по расписанию с помощью refreshable materialized views. | Обновляются асинхронно в фоновом режиме после INSERT в основную таблицу. |
| Взаимодействие с запросами | Работа с Materialized Views требует выполнять запросы напрямую к целевой таблице, то есть при написании запросов нужно учитывать наличие materialized views. | Проекции автоматически выбираются оптимизатором запросов ClickHouse и прозрачны для пользователя: чтобы их использовать, не нужно изменять запросы к таблице с проекцией. Начиная с версии 25.6 также можно фильтровать более чем по одной проекции. |
Обработка UPDATE / DELETE | Не реагируют автоматически на операции UPDATE или DELETE в исходной таблице, поскольку materialized views не знают об исходной таблице и работают только как insert triggers для вставки в исходную таблицу. Это может приводить к устареванию данных между исходной и целевой таблицами и требует обходных решений или периодического полного обновления. (через refreshable materialized view). | По умолчанию несовместимы со строками DELETED (особенно при легковесных удалениях). lightweight_mutation_projection_mode (v24.7+) может включить совместимость. |
Поддержка JOIN | Да. Refreshable materialized views можно использовать для сложной денормализации. Incremental materialized views срабатывают только при вставках в самую левую таблицу. | Нет. Операции JOIN не поддерживаются в определениях проекций для фильтрации материализованных данных. Однако запросы, объединяющие таблицы с проекциями, работают нормально — проекции оптимизируют доступ к отдельным таблицам. |
Секция WHERE в определении | Да. Секции WHERE можно использовать для фильтрации данных перед materialization. | Нет. Секции WHERE не поддерживаются в определениях проекций для фильтрации материализованных данных. |
| Возможности построения цепочек | Да, целевая таблица одной materialized view может быть источником для другой materialized view, что позволяет строить многоэтапные конвейеры. | Нет. Проекции нельзя выстраивать в цепочки. |
| Применимые движки таблиц | Можно использовать с различными движками исходных таблиц, но целевые таблицы обычно относятся к семейству MergeTree. | Доступны только для движков таблиц семейства MergeTree. |
| Обработка сбоев | Сбой во время вставки данных означает потерю данных в целевой таблице, что может привести к несогласованности. | Сбои обрабатываются незаметно в фоновом режиме. Запросы могут без проблем сочетать материализованные и нематериализованные части. |
| Операционная нагрузка | Требуется явное создание целевой таблицы и часто ручная дозагрузка. Поддержание согласованности с UPDATE/DELETE повышает сложность. | Проекции поддерживаются автоматически и остаются синхронизированными, поэтому обычно требуют меньше операционных усилий. |
Совместимость запросов с FINAL | Обычно совместимы, но часто требуют GROUP BY по целевой таблице. | Не работают с запросами FINAL. |
| Lazy materialization | Да. | Следите за проблемами совместимости проекций при использовании возможностей materialization. Может потребоваться установить query_plan_optimize_lazy_materialization = false |
| Параллельные реплики | Да. | Нет. |
optimize_read_in_order | Да. | Да. |
| Легковесные обновления и удаления | Да. | Нет. |