Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Вы находитесь на странице архива. Актуальная документация доступна по ссылке.

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

Содержание раздела
  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.