Пользователи часто спрашивают, когда следует использовать Materialized views, а когда — проекции. В этой статье мы рассмотрим ключевые различия между ними и объясним, почему в одних сценариях стоит выбрать одно, а в других — другое.
Сводка ключевых различий
Сравнение materialized views и проекций
Когда стоит выбирать materialized views
- Вы работаете с ETL в реальном времени и многоэтапными конвейерами данных: вам нужно выполнять сложные преобразования, агрегации или направлять данные по мере их поступления, в том числе через несколько этапов, выстраивая цепочку представлений.
- Вам нужна сложная денормализация: вам нужно заранее объединить данные из нескольких источников (таблиц, подзапросов или словарей) в одну таблицу, оптимизированную для запросов, особенно если допустимы периодические полные обновления с использованием refreshable materialized views.
- Вам нужен явный контроль над схемой: вам нужна отдельная, обособленная целевая таблица с собственной схемой и движком для хранения предварительно вычисленных результатов, что даёт больше гибкости при моделировании данных.
- Вы хотите фильтровать на этапе ингестии: вам нужно фильтровать данные до их материализации, уменьшая объём данных, записываемых в целевую таблицу.
Когда не стоит использовать materialized view
- Исходные данные часто обновляются или удаляются: без дополнительных механизмов, обеспечивающих согласованность между исходной и целевой таблицами, incremental materialized views могут устаревать и становиться несогласованными.
- В приоритете простота и автоматическая оптимизация: если вы не хотите управлять отдельными целевыми таблицами.
Когда стоит выбирать проекции
- Оптимизация запросов к одной таблице: ваша основная цель — ускорить запросы к одной базовой таблице за счёт альтернативных порядков сортировки, оптимизации фильтров по столбцам, не входящим в первичный ключ, или предварительного вычисления агрегаций для одной таблицы.
- Вам нужна прозрачность запросов: вы хотите, чтобы запросы без изменений выполнялись к исходной таблице, а ClickHouse сам выбирал оптимальную структуру данных для конкретного запроса.
Когда следует избегать проекций
- Требуются сложные преобразования данных или многоэтапный ETL: определения проекций не поддерживают операции
JOIN, их нельзя выстраивать в цепочку для создания многошаговых конвейеров, и они не поддерживают некоторые возможности SQL, такие как оконные функции или сложные выраженияCASE. Хотя запросы к таблицам с проекциями могут свободно использоватьJOIN, сами проекции не подходят для сложных преобразований данных. - Требуется явная фильтрация материализованных данных: проекции не поддерживают секции
WHEREв своих определениях для фильтрации данных, которые материализуются в саму проекцию. - Используются движки таблиц, отличные от
MergeTree: проекции доступны только для таблиц, использующих семейство движковMergeTree. FINAL-запросы критически важны: проекции не работают с запросамиFINAL, которые иногда используются для дедупликации.- Вам нужны параллельные реплики, так как проекции их не поддерживают.