CREATE MATERIALIZED VIEW

Содержание раздела
  1. Синтаксис
    1. Ключевое слово PRIMARY KEY
    2. Ключевое слово DISTRIBUTED BY
    3. Ключевое слово DATASOURCE_TYPE
    4. Ключевое слово AS SELECT
    5. Ключевое слово LOGICAL_ONLY
  2. Ограничения
    1. Ограничения выполнения
    2. Ограничения СУБД
    3. Ограничения имен
    4. Ограничения столбцов
    5. Ограничения SELECT-подзапроса
    6. Другие ограничения
  3. Примеры
    1. Представление на основе одной таблицы с условием
    2. Представление на основе одной таблицы с условием, агрегацией и группировкой
    3. Представление на основе двух таблиц
    4. Представление только на логическом уровне
    5. Представление на основе данных из двух логических баз данных

Поддерживается в версиях:  6.1 / 6.0 / 5.8 / 5.7 / 5.6.1 / 5.5 / 5.4 / 5.3 / 5.2 / 5.1 / 5.0.

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

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

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

Будьте осторожны при построении материализованных представлений на основе соединения логических таблиц и standalone-таблиц. В standalone-таблицах недоступно версионирование данных, и некоторые изменения данных из этих таблиц не будут попадать в представление.

Запрос попадает в очередь операций и обрабатывается в порядке его поступления в очередь. В ответе возвращается:

  • пустой объект ResultSet при успешном выполнении запроса;
  • исключение при неуспешном выполнении запроса.

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

В отличие от запроса на создание логической таблицы, запрос CREATE MATERIALIZED VIEW должен содержать ключевое слово DATASOURCE_TYPE со списком датасорсов для размещения данных представления. Требование связано с тем, что данные представлений (в отличие от данных логических таблиц) могут размещаться не во всех СУБД.

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

Для столбцов материализованного представления можно указать ограничение NOT NULL. Но в этом случае учитывайте, что вставка значений NULL в такие столбцы приведет к ошибке синхронизации представления.

Изменение материализованного представления недоступно. Чтобы заменить материализованное представления, удалите его и создайте новое.

Ошибка выполнения корректного запроса блокирует последующие запросы в этой логической базе данных. В случае блокировки устраните причины сбоя и повторите сбойную операцию. Если повторение операции невозможно, удалите сбойную операцию запросом ERASE_CHANGE_OPERATION и вручную устраните несоответствия на физическом уровне (если такие есть).

Каждое создание представления записывается в журнал. Журнал можно посмотреть с помощью запроса GET_CHANGES.

Синтаксис

CREATE MATERIALIZED VIEW [db_name.]materialized_view_name (
  column_name_1 datatype_1 [ NULL | NOT NULL ],
  column_name_2 datatype_2 [ NULL | NOT NULL ],
  column_name_3 datatype_3 [ NULL | NOT NULL ],
  PRIMARY KEY (column_list_1)
) DISTRIBUTED BY (column_list_2)
[DATASOURCE_TYPE (datasource_aliases)]
AS SELECT query
DATASOURCE_TYPE = origin_datasource_alias
[LOGICAL_ONLY]

Параметры:

db_name

Имя логической базы данных, в которой создается материализованное представление. Опционально, если выбрана логическая БД, используемая по умолчанию.

materialized_view_name

Имя создаваемого материализованного представления, уникальное среди логических сущностей логической БД.

column_name_N

Имя столбца представления.

datatype_N

Тип данных столбца column_name_N. Возможные значения см. в разделе Логические типы данных.

column_list_1

Список столбцов, входящих в первичный ключ представления.

column_list_2

Список столбцов, входящих в ключ шардирования представления. Столбцы должны быть из числа столбцов column_list_1.

datasource_aliases

Список имен датасорсов, в которых нужно разместить данные представления.
Элементы списка перечисляются через запятую, каждый из них указывается в одинарных кавычках (например, 'adg'). Варианты, которые остаются доступными, но могут быть удалены в будущем: значения без кавычек (например, adg) или в двойных кавычках (например, "adg").

Данные представления могут размещаться в датасорсах с СУБД ADG, ADQM и (или) ADP.

query

SELECT-подзапрос, на основе которого строится представление.

origin_datasource_alias

Имя датасорса, который служит источником данных. Значение указывается в одинарных кавычках.

Источником данных может быть только датасорс с СУБД ADB.

Ключевое слово PRIMARY KEY

Ключевое слово PRIMARY KEY задает список столбцов, входящих в первичный ключ представления.

Ключевое слово DISTRIBUTED BY

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

Ключевое слово DATASOURCE_TYPE

Первое ключевое слово DATASOURCE_TYPE задает список датасорсов для размещения данных материализованного представления, второе ключевое DATASOURCE_TYPE — датасорс, из которого выбираются данные. См. также параметры datasource_aliases и origin_datasource_alias.

Ключевое слово AS SELECT

Ключевое слово AS SELECT задает SELECT-подзапрос, на котором строится представление.

Ключевое слово LOGICAL_ONLY

Ключевое слово LOGICAL_ONLY позволяет создать материализованное представление только на логическом уровне (в логической схеме данных), без пересоздания связанных физических таблиц в хранилище данных.

Если ключевое слово не указано, создается как материализованное представление, так и связанные с ним физические таблицы.

Ограничения

Ограничения выполнения

Ограничения СУБД

  • Данные материализованных представлений могут размещаться в СУБД ADP, ADQM и ADG.
  • Источником данных для материализованного представления может быть СУБД ADB.

Ограничения имен

  • Имена представления, столбцов и псевдонимов должны соответствовать требованиям, описанным в разделе Соглашения об именах.
  • Имена столбцов должны быть уникальны в рамках представления.

Ограничения столбцов

  • Порядок столбцов и их типы данных должны совпадать в SELECT-подзапросе и представлении.
  • Первичный ключ должен включать все столбцы ключа шардирования.

Ограничения SELECT-подзапроса

  • Подзапрос не может содержать:
  • Если в подзапросе указана одна логическая таблица и нет группировки и агрегации данных, указанная таблица и материализованное представление должны находиться в одной логической БД.
  • Система не проверяет корректность подзапроса при создании представления.

Чтобы проверить корректность SELECT-подзапроса, рекомендуется выполнить его как самостоятельный запрос перед созданием представления.
Другой способ проверки — проверить уже созданное представление с помощью запроса CHECK_MATERIALIZED_VIEW. Если в ответе на запрос вернулась информация, что все дельты синхронизированы и нет ошибок синхронизации, — значит, при создании представления был указан корректный SELECT-подзапрос.

Другие ограничения

  • Представления, построенные на соединении логических таблиц и standalone-таблиц, могут содержать не все изменения standalone-таблиц из-за того, что такие таблицы не поддерживают версионирование данных.
  • Информационная схема обновляется асинхронно, поэтому созданное представление может не сразу появиться в информационной схеме.

Примеры

Представление на основе одной таблицы с условием

Создание представления с размещением в двух датасорсах (adg и adqm):

CREATE MATERIALIZED VIEW marketing.sales_august_2020 (
  id BIGINT NOT NULL,
  transaction_date TIMESTAMP NOT NULL,
  product_code VARCHAR(256) NOT NULL,
  product_units BIGINT NOT NULL,
  store_id BIGINT NOT NULL,
  description VARCHAR(256),
  PRIMARY KEY (id)
)
DISTRIBUTED BY (id)
DATASOURCE_TYPE ('adg', 'adqm')
AS SELECT * FROM marketing.sales
   WHERE cast(transaction_date as date) BETWEEN '2020-08-01' AND '2020-08-31'
DATASOURCE_TYPE = 'adb'

Представление на основе одной таблицы с условием, агрегацией и группировкой

Создание представления с размещением в одном датасорсе (adqm):

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 ('adqm')
AS SELECT store_id, product_code, SUM(product_units) as product_units FROM marketing.sales
   WHERE product_code <> 'ABC0001'
   GROUP BY store_id, product_code
DATASOURCE_TYPE = 'adb'

Представление на основе двух таблиц

CREATE MATERIALIZED VIEW marketing.sales_and_stores (
  id BIGINT NOT NULL,
  transaction_date TIMESTAMP NOT NULL,
  product_code VARCHAR(256) NOT NULL,
  product_units BIGINT NOT NULL,
  description VARCHAR(256),
  store_id BIGINT NOT NULL,
  store_category VARCHAR(256) NOT NULL,
  region VARCHAR(256) NOT NULL,
  PRIMARY KEY (id, region)
)
DISTRIBUTED BY (id)
DATASOURCE_TYPE ('adg')
AS SELECT
 s.id, s.transaction_date, s.product_code, s.product_units, s.description,
 st.id AS store_id, st.category as store_category, st.region
 FROM marketing.sales AS s
 JOIN marketing.stores AS st
 ON s.store_id = st.id
DATASOURCE_TYPE = 'adb'

Представление только на логическом уровне

CREATE MATERIALIZED VIEW marketing.stores_by_sold_products_matview (
  store_id BIGINT NOT NULL,
  product_amount BIGINT NOT NULL,
  PRIMARY KEY (store_id)
)
DISTRIBUTED BY (store_id)
DATASOURCE_TYPE ('adg')
AS SELECT store_id, SUM(product_units) AS product_amount
  FROM marketing.sales
  GROUP BY store_id
DATASOURCE_TYPE = 'adb'
LOGICAL_ONLY

Представление на основе данных из двух логических баз данных

CREATE MATERIALIZED VIEW marketing.moscow_sales_by_store_category (
  store_id BIGINT,
  category VARCHAR(256),
  product_units BIGINT,
  PRIMARY KEY (store_id)
)
DISTRIBUTED BY (store_id)
DATASOURCE_TYPE ('adg', 'adqm', 'adp')
AS SELECT s.store_id, st.category, SUM(s.product_units) as product_units
  FROM moscow.sales as s
  JOIN marketing.stores as st
    ON s.store_id = st.id
  GROUP BY s.store_id, st.category
DATASOURCE_TYPE = 'adb'