Материализованное представление
Содержание раздела
Материализованное представление — набор записей, который является результатом исполнения SELECT-подзапроса.
Материализованное представление позволяет предварительно вычислить результат запроса к данным одного или нескольких датасорсов (далее — датасорс-источник) и сохранить этот результат для будущего использования в тех же или других датасорсах (далее — датасорс-приемник). SELECT-подзапрос, на котором строится представление, может обращаться к любым сущностям одной или нескольких логических баз данных, кроме материализованных и логических представлений.
Материализованное представление может иметь несколько датасорсов-источников, если построено на подзапросе к партиционированной таблице, партиции которой распределены по разным датасорсам.
Примеры применения
Материализованное представление помогает ускорить запросы к данным в следующих случаях:
- представление содержит результаты сложного запроса, который на исходных данных выполняется дольше;
- запросы к представлению возвращают значительно меньше данных, чем запросы к исходным данным;
- запросы относятся к категории, которую тот тип датасорса, где размещены данные представления, выполняет более эффективно, чем тип датасорса, служащего источником данных (например, ADG быстрее всех из поддерживаемых СУБД обрабатывает чтение по ключу).
Поддерживаемые типы датасорсов
Для материализованных представлений поддерживаются следующие типы датасорсов в качестве источника (отмечен слева от стрелки) и приемника (отмечен справа от стрелки):
- источник и приемник в одном датасорсе:
- ADB → ADB,
- ADP → ADP,
- ADG → ADG,
- источник и приемник в разных датасорсах:
- ADB → ADP, ADQM и (или) ADG,
- ADP → ADP и (или) ADG.
Датасорсы-приемники можно комбинировать в материализованном представлении с учетом поддерживаемых типов: например, можно создать представление на основе данных датасорса типа ADB в датасорсах типа ADP и ADQM.
Хранение данных на физическом уровне
Данные материализованного представления хранятся аналогично данным логических таблиц — в физических таблицах хранилища данных, создаваемых системой при создании представления.
Действия с представлениями
Материализованные представления можно создавать и удалять.
Действия с данными представлений
Данные материализованного представления можно читать и выгружать. Загрузка и обновление данных недоступны для материализованных представлений.
Из материализованного представления можно запросить срез данных, соответствующий указанной версии, используя ключевое слово FOR SYSTEM_TIME. Если версия данных не указана, система возвращает данные по состоянию на момент последней синхронизации представления.
Чтение несинхронизированных данных из представления недоступно. Если материализованное представление отстало от датасорса-источника и не содержит запрошенные данные, система перенаправляет запрос к исходным таблицам датасорса-источника. Перенаправленный запрос может выполняться дольше, но он позволяет получить целостный набор данных.
Синхронизация материализованных представлений
Система поддерживает целостность данных материализованных представлений, периодически синхронизируя их с датасорсом-источником.
Синхронизацией материализованных представлений занимается:
- лидер — если кластер работает в основном режиме (с лидером);
- нода, выбранная случайным образом, — если кластер работает в leaderless-режиме.
Проверка перед синхронизацией
Система периодически (по таймеру) проверяет, нужно ли синхронизировать материализованные представления окружения с датасорсом-источником. Проверка представлений не запускается по другим событиям: при создании представления, изменении данных в источнике и т.д.
Периодичность проверки регулируется параметром конфигурации MATERIALIZED_VIEWS_SYNC_PERIOD_MS
. По умолчанию проверка запускается раз в 5 секунд. Синхронизацию материализованных представлений можно отключить, установив значение параметра равным 0.
Запуск синхронизации
Синхронизация представлений запускается, если с момента последней синхронизации в датасорсе-источнике появились закрытые дельты. Материализованное представление, основанное на данных из разных логических баз данных, синхронизируется при наличии новых дельт в той логической БД, которой принадлежит представление.
Если датасорс-источник материализованного представления отключен, синхронизация представления запустится только после включения датасорса.
Количество одновременно синхронизируемых представлений регулируется параметром конфигурации MATERIALIZED_VIEWS_CONCURRENT
. По умолчанию одновременно синхронизируется максимум два представления, а остальные, если они есть, ожидают следующего цикла проверки.
Порядок синхронизации
Представление последовательно синхронизируется по закрытым, но еще не синхронизированным дельтам. Для каждой дельты система рассчитывает и сохраняет изменения, совершенные между предыдущей и этой дельтой по SELECT-запросу, на котором построено представление.
Если системе не удалось синхронизировать материализованное представление, она делает несколько повторных попыток. Максимальное количество таких попыток регулируется параметром конфигурации MATERIALIZED_VIEWS_RETRY_COUNT
. По умолчанию система делает до 10 попыток. Если количество попыток исчерпано, но представление так и не удалось синхронизировать, система прекращает попытки синхронизировать это представление.
В случае перезапуска системы счетчики попыток синхронизации обнуляются, и система снова пытается синхронизировать представления, которые остались несинхронизированными.
Статусы синхронизации материализованных представлений можно посмотреть с помощью запроса CHECK_MATERIALIZED_VIEW.
Пример синхронизации
Рассмотрим пример со следующими условиями:
- логическая БД
marketing
содержит логическую таблицуsales
и материализованное представлениеsales_by_stores
; - логическая БД содержит две дельты:
- дельта 0: в таблицу
sales
добавлено две записи (с идентификаторами 100 и 101); - дельта 1: в таблицу
sales
добавлено еще две записи (с идентификаторами 102 и 103);
- дельта 0: в таблицу
- материализованное представление
sales_by_stores
содержит результат агрегации и группировки данных таблицыsales
и построено на основе следующего запроса:CREATE MATERIALIZED VIEW marketing.sales_by_stores ( store_id BIGINT NOT NULL, product_code VARCHAR(256) NOT NULL, product_units BIGINT NOT NULL, PRIMARY KEY (store_id, product_code) ) DISTRIBUTED BY (store_id) DATASOURCE_TYPE ('adp2') AS SELECT store_id, product_code, SUM(product_units) FROM marketing.sales WHERE product_code <> 'ABC0001' GROUP BY store_id, product_code DATASOURCE_TYPE = 'adp1'
На рисунках ниже показан порядок синхронизации материализованного представления sales_by_stores
. В каждой дельте рассчитывается и сохраняется сумма по столбцу product_units
таблицы sales
с группировкой по столбцам store_id
и product_code
. При этом неважно, когда было создано материализованное представление: до дельты 0, после дельты 1 или в какой-то момент между этими дельтами.
Статистика запросов к представлению
По умолчанию система ведет статистику по логическим сущностям, которую можно получить с помощью запроса GET_ENTITY_STATISTICS или GET-метода /datamarts/{datamart}/tables/{entity}/statistics.