CREATE MATERIALIZED VIEW#
Синтаксис#
CREATE [ OR REPLACE ] MATERIALIZED VIEW
[ IF NOT EXISTS ] view_name
[ GRACE PERIOD interval ]
[ WHEN STALE ( INLINE | FAIL ) ]
[ COMMENT string ]
[ WITH properties ]
AS query
Описание#
Создает и проверяет определение нового материализованного представления
view_name для query SELECT. После создания необходимо выполнить
инструкцию REFRESH MATERIALIZED VIEW, чтобы заполнить материализованное
представление данными. Материализованное представление является физическим
представлением результатов запроса на момент refresh. Данные сохраняются, и к
ним могут обращаться последующие запросы.
Запросы, обращающиеся к материализованным представлениям, обычно выполняются быстрее, чем получение данных из представления, созданного тем же запросом. Любые вычисления, агрегации и другие операции для создания данных выполняются один раз во время refresh материализованного представления, а не при каждом обращении к представлению. Многократное чтение данных представления со временем или несколькими пользователями приводит к повторной обработке. Для материализованных представлений этого удается избежать.
Необязательное предложение OR REPLACE заменяет материализованное
представление, если оно уже существует, вместо того чтобы выдавать ошибку.
Необязательное предложение IF NOT EXISTS создает материализованное
представление только в том случае, если оно еще не существует.
Обратите внимание, что OR REPLACE и IF NOT EXISTS являются
взаимоисключающими предложениями.
Необязательное предложение GRACE PERIOD указывает, как долго материализация
запроса используется при выполнении запросов:
В пределах grace period с момента последнего refresh получение данных очень производительно, потому что используется материализация запроса. Однако данные могут быть не синхронизированы с базовыми таблицами.
После истечения grace period данные материализованного представления вычисляются на лету с использованием
query. Поэтому получение данных медленнее, но они синхронизированы с базовыми таблицами.Если предложение не указано, grace period по умолчанию считается бесконечным, и поэтому все запросы находятся в пределах grace period.
Каждая операция REFRESH MATERIALIZED VIEW сбрасывает время начала grace period.
Необязательное предложение WHEN STALE задает поведение, когда
материализованное представление устарело, то есть находится вне grace period:
INLINE- если материализованное представление устарело, оно раскрывается как логическое представление, а запросы к материализованному представлению используют базовое определение запроса для получения актуальных данных. Это поведение по умолчанию, когдаWHEN STALEне указано.FAIL- если материализованное представление устарело, запросы к нему завершаются ошибкой.
Обратите внимание, что предложение WHEN STALE требует поддержки со стороны
коннектора. Если коннектор не поддерживает эту возможность, использование
WHEN STALE с любым значением, кроме INLINE, приводит к ошибке.
Необязательное предложение COMMENT сохраняет комментарий string вместе с
метаданными материализованного представления. Комментарий отображается
инструкцией SHOW CREATE MATERIALIZED VIEW и доступен в таблице
system.metadata.materialized_view_properties.
Необязательное предложение WITH используется для определения свойств при
создании материализованного представления. Несколько пар свойство/значение
разделяются запятыми. Коннектор использует свойства как входные параметры для
операции refresh материализованного представления. Поддерживаемые свойства
различаются для каждого коннектора и подробно описаны в разделе поддержки SQL
документации конкретного коннектора.
После успешного создания все метаданные материализованного представления доступны в system table.
Примеры#
Создать простое материализованное представление cancelled_orders поверх
таблицы orders, включающее только отмененные заказы. Обратите внимание, что
orderstatus является числовым значением, которое может быть неочевидным для
потребителя, но имя представления проясняет содержимое:
CREATE MATERIALIZED VIEW cancelled_orders
AS
SELECT orderkey, totalprice
FROM orders
WHERE orderstatus = 3;
Создать или заменить материализованное представление order_totals_by_date,
которое агрегирует orders по всем заказам всех клиентов:
CREATE OR REPLACE MATERIALIZED VIEW order_totals_by_date
AS
SELECT orderdate, sum(totalprice) AS price
FROM orders
GROUP BY orderdate;
Создать материализованное представление для каталога, использующего коннектор Iceberg, с комментарием и секционированием по двум полям в хранилище:
CREATE MATERIALIZED VIEW orders_nation_mkgsegment
COMMENT 'Orders with nation and market segment data'
WITH ( partitioning = ARRAY['mktsegment', 'nationkey'] )
AS
SELECT o.*, c.nationkey, c.mktsegment
FROM orders AS o
JOIN customer AS c
ON o.custkey = c.custkey;
Задать несколько свойств:
WITH ( format = 'ORC', partitioning = ARRAY['_date'] )
Создать материализованное представление с grace period и поведением
WHEN STALE, при котором запрос завершается ошибкой, если представление
устарело:
CREATE MATERIALIZED VIEW orders_summary
GRACE PERIOD INTERVAL '1' HOUR
WHEN STALE FAIL
AS
SELECT orderdate, sum(totalprice) AS price
FROM orders
GROUP BY orderdate;
Создать материализованное представление с явным поведением INLINE
(по умолчанию):
CREATE MATERIALIZED VIEW orders_summary
GRACE PERIOD INTERVAL '1' HOUR
WHEN STALE INLINE
AS
SELECT orderdate, sum(totalprice) AS price
FROM orders
GROUP BY orderdate;
Показать определенные свойства материализованных представлений для всех каталогов:
SELECT * FROM system.metadata.materialized_view_properties;
Показать метаданные материализованных представлений во всех каталогах:
SELECT * FROM system.metadata.materialized_views;