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

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

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