Материализованное представление

Содержание раздела
  1. Примеры применения
  2. Источник и месторасположение данных
  3. Хранение данных на физическом уровне
  4. Действия с представлениями
  5. Действия с данными представлений
  6. Синхронизация материализованных представлений
    1. Проверка перед синхронизацией
    2. Запуск синхронизации
    3. Порядок синхронизации
    4. Пример синхронизации
  7. Статистика запросов к представлению

Материализованное представление — набор записей, который является результатом исполнения SELECT-запроса. Материализованное представление позволяет предварительно вычислить результат запроса и сохранить его для будущего использования.

SELECT-запрос, на котором строится представление, может обращаться к данным одной или нескольких логических баз данных.

Примеры применения

Материализованное представление помогает ускорить запросы к данным в следующих случаях:

  • если представление содержит результаты сложного запроса, который на исходных данных выполняется дольше;
  • если запросы к представлению возвращают значительно меньше данных, чем запросы к исходным данным;
  • если запросы относятся к категории, которую СУБД датасорса, где размещены данные представления, выполняет более эффективно, чем СУБД, служащая источником данных (например, ADG быстрее всех из поддерживаемых СУБД обрабатывает чтение по ключу).

Источник и месторасположение данных

Материализованное представление строится на основе данных одного датасорса (далее — датасорс-источник), а его данные размещаются в других датасорсах (далее — датасорсы-приемники). В текущей версии системы доступно создание материализованных представлений в датасорсах с СУБД ADQM, ADG и ADP на основе данных датасорса с СУБД ADB.

Система поддерживает целостность данных материализованных представлений, периодически синхронизируя их с датасорсом-источником (см. ниже).

Синхронизация материализованных представлений

Такая схема получения и размещения данных позволяет создавать инсталляции, где один датасорс служит полноценным хранилищем исходных данных, а остальные датасорсы отвечают за быструю выдачу данных по запросам чтения.

Хранение данных на физическом уровне

Данные материализованного представления хранятся аналогично данным логических таблиц — в физических таблицах хранилища, которые автоматически создаются при создании представления.

Действия с представлениями

Материализованные представления можно создавать и удалять.

Действия с данными представлений

Данные материализованного представления можно читать и выгружать. Загрузка и обновление данных недоступны для материализованных представлений.

Из материализованного представления можно запросить срез данных, соответствующий указанной версии, используя ключевое слово 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);
  • материализованное представление 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 ('adg')
    AS SELECT store_id, product_code, SUM(product_units) FROM marketing.sales
     WHERE product_code <> 'ABC0001'
     GROUP BY store_id, product_code
    DATASOURCE_TYPE = 'adb'
    

На рисунках ниже показан порядок синхронизации материализованного представления sales_by_stores. В каждой дельте рассчитывается и сохраняется сумма по столбцу product_units таблицы sales с группировкой по столбцам store_id и product_code. При этом неважно, когда было создано материализованное представление: до дельты 0, после дельты 1 или в какой-то момент между этими дельтами.

Состояние данных на момент дельты 0

Состояние данных на момент дельты 1

Статистика запросов к представлению

По умолчанию система ведет статистику обработки запросов к данным материализованных представлений и других сущностей. Статистику по представлению можно получить с помощью GET_ENTITY_STATISTICS или GET-метода /datamarts/{datamart}/tables/{entity}/statistics.