Использование Материализованных Представлений
ClickHouse поддерживает два типа материализованных представлений: инкрементные и обновляемые. Хотя оба предназначены для ускорения запросов путем предварительного вычисления и хранения результатов, они значительно различаются по тому, как и когда выполняются основные запросы, для каких нагрузок они подходят и как обрабатывается актуальность данных.
Пользователи должны рассматривать материализованные представления для конкретных шаблонов запросов, которые необходимо ускорить, при условии, что ранее были выполнены лучшие практики относительно типа и оптимизации первичного ключа.
Инкрементные материализованные представления обновляются в реальном времени. По мере добавления новых данных в исходную таблицу ClickHouse автоматически применяет запрос материализованного представления к новому блоку данных и записывает результаты в отдельную целевую таблицу. Со временем ClickHouse объединяет эти частичные результаты, чтобы получить полное, актуальное представление. Этот подход является высокоэффективным, потому что он переносит вычислительные затраты на время вставки и обрабатывает только новые данные. В результате запросы SELECT
к целевой таблице быстры и легковесны. Инкрементные представления поддерживают все агрегатные функции и хорошо масштабируются — даже до петабайтов данных, потому что каждый запрос работает на небольшом, недавнем подмножестве вставляемого набора данных.

Обновляемые материализованные представления, напротив, обновляются по расписанию. Эти представления периодически повторно выполняют свой полный запрос и перезаписывают результат в целевую таблицу. Это похоже на материализованные представления в традиционных OLTP базах данных, таких как Postgres.

Выбор между инкрементными и обновляемыми материализованными представлениями в значительной степени зависит от характера запроса, как часто меняются данные, и необходимы ли обновления представления, которые должны отражать каждую строку по мере её вставки, или периодическое обновление будет приемлемо. Понимание этих компромиссов имеет ключевое значение для проектирования производительных, масштабируемых материализованных представлений в ClickHouse.
Когда использовать инкрементные материализованные представления
Инкрементные материализованные представления обычно предпочитаются, так как они автоматически обновляются в реальном времени, когда исходные таблицы получают новые данные. Они поддерживают все агрегатные функции и особенно эффективны для агрегации по одной таблице. Вычисляя результаты инкрементально во время вставки, запросы выполняются на значительно меньших подмножествах данных, что позволяет этим представлениям без труда масштабироваться даже до петабайтов данных. В большинстве случаев они не имеют заметного воздействия на общую производительность кластера.
Используйте инкрементные материализованные представления, когда:
- Вам нужны результаты запросов в реальном времени, обновляемые с каждой вставкой.
- Вы регулярно агрегируете или фильтруете большие объемы данных.
- Ваши запросы включают простые преобразования или агрегации по одним таблицам.
Для примеров инкрементных материализованных представлений смотрите здесь.
Когда использовать обновляемые материализованные представления
Обновляемые материализованные представления выполняют свои запросы периодически, а не инкрементально, храня набор результатов запроса для быстрого извлечения.
Они наиболее полезны, когда производительность запросов имеет решающее значение (например, задержка меньше миллисекунды), и допустимы немного устаревшие результаты. Поскольку запрос выполняется полностью, обновляемые представления лучше подходят для запросов, которые относительно быстро вычисляются или могут вычисляться с редкими интервалами (например, раз в час), например, кэширование результатов «топ N» или таблиц поиска.
Частота выполнения должна быть тщательно настроена, чтобы избежать избыточной нагрузки на систему. Экстремально сложные запросы, которые потребляют значительные ресурсы, должны планироваться осторожно — они могут привести к ухудшению общей производительности кластера, повлияв на кэши и потребляя CPU и память. Запрос должен выполняться относительно быстро по сравнению с интервалом обновления, чтобы избежать перегрузки вашего кластера. Например, не планируйте обновление представления каждые 10 секунд, если сам запрос занимает как минимум 10 секунд для вычисления.
Резюме
В резюме используйте обновляемые материализованные представления, когда:
- Вам нужны кэшированные результаты запросов, доступные мгновенно, и незначительные задержки в актуальности допустимы.
- Вам нужен «топ N» для набора результатов запроса.
- Размер набора результатов не растёт бесконечно со временем. Это приведет к ухудшению производительности целевого представления.
- Вы выполняете сложные соединения или денормализацию, включая несколько таблиц, требующие обновлений при изменении любой исходной таблицы.
- Вы создаете пакетные рабочие процессы, задачи денормализации или создаете зависимости представлений, подобные DAG'ам DBT.
Для примеров обновляемых материализованных представлений смотрите здесь.
Режим APPEND против REPLACE
Обновляемые материализованные представления поддерживают два режима для записи данных в целевую таблицу: APPEND
и REPLACE
. Эти режимы определяют, как результат запроса представления записывается при обновлении представления.
REPLACE
является поведением по умолчанию. Каждый раз, когда представление обновляется, предыдущее содержимое целевой таблицы полностью перезаписывается с последним результатом запроса. Это подходит для случаев использования, когда представление всегда должно отражать последнее состояние, например, кэширование набора результатов.
APPEND
, напротив, позволяет добавлять новые строки в конец целевой таблицы вместо замены ее содержимого. Это раскрывает дополнительные возможности использования, такие как захват периодических снимков. APPEND
особенно полезен, когда каждое обновление представляет собой отдельную точку во времени или когда желаемо историческое накопление результатов.
Выбирайте режим APPEND
, когда:
- Вы хотите сохранить историю прошлых обновлений.
- Вы создаете периодические снимки или отчеты.
- Вам нужно постепенно собирать обновленные результаты со временем.
Выбирайте режим REPLACE
, когда:
- Вам нужен только самый последний результат.
- Устаревшие данные должны быть полностью отброшены.
- Представление отражает актуальное состояние или справочник.
Пользователи могут найти применение функциональности APPEND
, если строят архитектуру Медалей.