Материализованное представление
Содержание раздела
Материализованное представление — набор записей, который является результатом исполнения SELECT-подзапроса. Материализованное представление позволяет предварительно вычислить результат запроса и сохранить его для будущего использования.
SELECT-подзапрос, на котором строится представление, может обращаться к сущностям одной или нескольких логических баз данных, кроме следующих сущностей:
- логических представлений,
- материализованных представлений.
Примеры применения
Материализованное представление помогает ускорить запросы к данным в следующих случаях:
- если представление содержит результаты сложного запроса, который на исходных данных выполняется дольше;
- если запросы к представлению возвращают значительно меньше данных, чем запросы к исходным данным;
- если запросы относятся к категории, которую тот тип датасорса, где размещены данные представления, выполняет более эффективно, чем тип датасорса, служащего источником данных (например, ADG быстрее всех из поддерживаемых СУБД обрабатывает чтение по ключу).
Источник и месторасположение данных
Материализованное представление строится на основе данных одного датасорса (далее — датасорс-источник), а его данные размещаются в других датасорсах (далее — датасорсы-приемники). Такая схема размещения данных позволяет создавать инсталляции, где один датасорс служит полноценным хранилищем исходных данных, а остальные датасорсы отвечают за быструю выдачу данных по запросам чтения.
Возможны следующие варианты материализованных представлений:
- источник данных расположен в датасорсе типа ADB, а данные представления — в датасорсе типа ADP, ADG и (или) ADQM,
- источник данных расположен в датасорсе типа ADP, а данные представления — в том же или другом датасорсе типа ADP и (или) в датасорсе типа ADG.
Система поддерживает целостность данных материализованных представлений, периодически синхронизируя их с датасорсом-источником.
Хранение данных на физическом уровне
Данные материализованного представления хранятся аналогично данным логических таблиц — в физических таблицах хранилища данных, автоматически создаваемых системой при создании представления.
Действия с представлениями
Материализованные представления можно создавать и удалять.
Действия с данными представлений
Данные материализованного представления можно читать и выгружать. Загрузка и обновление данных недоступны для материализованных представлений.
Из материализованного представления можно запросить срез данных, соответствующий указанной версии, используя ключевое слово FOR SYSTEM_TIME. Если версия данных не указана, система возвращает данные по состоянию на момент последней синхронизации представления.
Чтение несинхронизированных данных из представления недоступно. Если материализованное представление отстало от датасорса-источника и не содержит запрошенные данные, система перенаправляет запрос к исходным таблицам датасорса-источника. Перенаправленный запрос может выполняться дольше, но он позволяет получить целостный набор данных.
Синхронизация материализованных представлений
Проверка перед синхронизацией
Система периодически (по таймеру) проверяет, нужно ли синхронизировать материализованные представления окружения с датасорсом-источником. Проверка представлений не запускается по другим событиям: при создании представления, изменении данных в источнике и т.д.
Периодичность проверки регулируется параметром конфигурации 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.