Прозрачное переписывание с помощью синхронных материализованных представлений
Синхронное материализованное представление (Sync-Materialized View) — это таблица с предварительно вычисленными данными, в которой хранятся результаты заранее заданного оператора SELECT. Оно позволяет анализировать исходные детальные данные по произвольным измерениям и ускоряет запросы агрегации по фиксированным измерениям.
При выполнении запроса Doris автоматически подбирает оптимальное материализованное представление и читает данные непосредственно из него. Весь процесс прозрачен для пользователя и называется «прозрачным переписыванием». При изменении данных в базовой таблице Doris автоматически поддерживает согласованность материализованного представления, без ручного вмешательства.
Предварительные требования
- Развёрнута Doris версии 2.0 или более поздней.
- Уже существует базовая таблица с детальными данными, к которой регулярно выполняются запросы с фиксированной агрегацией.
- У вас есть права на базу данных и таблицу, необходимые для создания материализованных представлений.
- Доступна тестовая среда, в которой можно проверить использование представлений запросами перед вводом в эксплуатацию.
Сценарии применения
| Тип сценария | Характерные особенности |
|---|---|
| Совместная работа с детальными данными и фиксированными измерениями | Требуется выполнять запросы как к детальным данным, так и к фиксированным агрегатам |
| Отсечение столбцов / строк | Запросы обращаются лишь к небольшой части столбцов или строк таблицы |
| Ресурсоёмкие операторы | Запросы содержат тяжёлые операции, например длительную агрегацию |
| Разные префиксные индексы | Для ускорения фильтрации нужны разные префиксные индексы |
Определение в одну строку: синхронное материализованное представление = таблица с предварительно агрегированными данными, согласованность которой поддерживается автоматически, + прозрачное переписывание с автоматическим подбором оптимального представления.
- В Doris 2.0 и более поздних версиях расширены возможности материализованных представлений. Перед вводом в эксплуатацию проверьте в тестовой среде, что целевые запросы могут использовать ожидаемое материализованное представление.
- Избегайте создания нескольких материализованных представлений со схожей структурой для одной таблицы: они могут конфликтовать друг с другом, из-за чего запросы не смогут их использовать.
Пример: агрегация продаж по магазинам
Предположим, есть таблица с детальными данными о продажах sales_records, в которой для каждой продажи записаны идентификатор транзакции, идентификатор продавца, идентификатор магазина, дата продажи и сумма транзакции. Распространённая аналитическая задача — агрегировать объём продаж по магазинам.
Следующие шаги позволяют создать материализованное представление store_amt, которое группирует данные по store_id и суммирует продажи, а затем проверить, что запросы прозрачно переписываются для использования этого представления.
Шаг 1: создание синхронного материализованного представления
-
Цель: заранее вычислить результаты для запросов с агрегацией по магазинам.
-
Команда:
CREATE MATERIALIZED VIEW store_amt AS
SELECT store_id, SUM(sale_amt)
FROM sales_records
GROUP BY store_id; -
Примечания: после отправки команды Doris асинхронно строит материализованное представление в фоновом режиме, не блокируя рабочие запросы.
Шаг 2: проверка хода построения
-
Цель: убедиться, что построение материализованного представления завершено.
-
Команда:
SHOW ALTER TABLE MATERIALIZED VIEW FROM db_name; -
Примечания: когда поле
Stateпринимает значениеFINISHED, представлениеstore_amtуспешно создано и может использоваться запросами.
Шаг 3: запуск прозрачного переписывания
-
Цель: обеспечить автоматическое использование материализованного представления запросами с соответствующей структурой агрегации.
-
Команда:
SELECT store_id, SUM(sale_amt) FROM sales_records GROUP BY store_id; -
Примечания: Doris автоматически подбирает
store_amtи напрямую читает предварительно агрегированные данные, без необходимости изменять SQL.
Шаг 4: проверка использования материализованного представления
-
Цель: убедиться, что прозрачное переписывание работает.
-
Команда:
EXPLAIN SELECT store_id, SUM(sale_amt) FROM sales_records GROUP BY store_id; -
Примечания: посмотрите на конец плана выполнения. Если вы видите следующий фрагмент, запрос использует
store_amt:TABLE: default_cluster:test.sales_records(store_amt), PREAGGREGATION: ON
Прозрачное переписывание и прямые запросы к базовой таблице
| Критерий сравнения | Прямой запрос к базовой таблице | Прозрачное переписывание для использования синхронного материализованного представления |
|---|---|---|
| Источник данных | Вычисления на основе детальных данных во время выполнения запроса | Прямое чтение предварительно агрегированных результатов |
| Производительность запросов агрегации | Сильно зависит от объёма данных | Существенно повышается |
| Затраты на переписывание SQL | Отсутствуют | Отсутствуют (автоматический подбор) |
| Согласованность данных | Обеспечивается естественным образом | Автоматически поддерживается Doris |
| Затраты на сопровождение | Отсутствуют | Требуется планировать структуру представлений, чтобы избежать конфликтов |
Часто задаваемые вопросы
Почему мой запрос не использует материализованное представление?
Распространённые причины:
- Материализованное представление ещё строится, и поле
Stateпока не приняло значениеFINISHED. - Столбцы, агрегатные функции или ключи группировки запроса не соответствуют определению материализованного представления.
- Для одной базовой таблицы существует несколько материализованных представлений со схожей структурой, что вызывает конфликт и мешает переписыванию.
Как выяснить причину: используйте EXPLAIN, чтобы проверить информацию TABLE: ...(materialized view name) в конце плана выполнения и определить, какая таблица используется на самом деле.
Как проверить состояние построения материализованного представления?
Выполните SHOW ALTER TABLE MATERIALIZED VIEW FROM db_name; и посмотрите на поле State:
PENDING/RUNNING: построение выполняется.FINISHED: построение завершено, и представление может использоваться запросами.CANCELLED: построение завершилось с ошибкой или было отменено. Выясните причину и создайте представление заново.
Можно ли создать несколько материализованных представлений для одной базовой таблицы?
Да, но избегайте схожей структуры. Несколько похожих представлений могут помешать механизму прозрачного переписывания выбрать оптимальное представление, из-за чего запросы не смогут его использовать. Сначала проверьте в тестовой среде, что запросы могут использовать ожидаемое представление.
Нужно ли вручную синхронизировать данные с материализованным представлением?
Нет. При изменении данных в базовой таблице Doris автоматически поддерживает согласованность материализованного представления.
Итоги
- Синхронное материализованное представление = таблица с предварительно агрегированными данными + автоматическое поддержание согласованности + прозрачное переписывание.
- Подходит для сценариев, в которых запросы к детальным данным сочетаются с агрегацией по фиксированным измерениям.
- После создания используйте
EXPLAINдля проверки использования представлений и избегайте конфликтов между похожими представлениями. - Перед вводом в эксплуатацию проверьте в тестовой среде, что целевые запросы используют ожидаемые представления.