Асинхронные материализованные представления
В этом разделе описывается, как понимать, создавать, использовать и управлять асинхронным материализованным представлением. Асинхронные материализованные представления поддерживаются начиная с Selena v1.5.2.
По сравнению с синхронными материализованными представлениями, асинхронные материализованные представления поддерживают соединение нескольких таблиц и больше агрегатных функций. Обновление асинхронных материализованных представлений может быть запущено вручную, регулярно через заданные интервалы или автоматически при изменении данных в базовой таблице. Вы также можете обновлять некоторые партиции вместо всего материализованного представления, что значительно снижает стоимость обновления. Кроме того, асинхронные материализованные представления поддерживают различные сценарии перезаписи запросов, позволяя автоматическое и прозрачное ускорение запросов.
Для сценария и использования синхронных материализованных представлений (Rollup) см. Синхронное материализованное представление (Rollup).
Обзор
Приложения в базах данных часто выполняют сложные запросы к большим таблицам. Такие запросы включают соединения нескольких таблиц и агрегации таблиц, содержащих миллиарды строк. Обработка этих запросов может быть дорогостоящей с точки зрения системных ресурсов и времени, необходимого для вычисления результатов.
Асинхронные материализованные представления в Selena предназначены для решения этих проблем. Асинхронное материализованное представление — это специальная физическая таблица, которая хранит предварительно вычисленные результаты запроса из одной или нескольких базовых таблиц. Когда вы выполняете сложные запросы к базовой таблице, Selena возвращает предварительно вычисленные результаты из соответствующих материализованных представлений для обработки этих запросов. Таким образом, производительность запросов может быть улучшена, поскольку избегаются повторяющиеся сложные вычисления. Эта разница в производительности может быть значительной, когда запрос выполняется часто или достаточно сложен.
Кроме того, асинхронные материализованные представления особенно полезны для построения математических моделей на основе вашего хранилища данных. Таким образом, вы можете предоставить единую спецификацию данных для приложений верхнего уровня, защитить базовую реализацию или обеспечить безопасность необработанных данных базовых таблиц.
Понимание материализованных представлений в Selena
Selena v1.5.2 и более ранние версии предоставляли синхронное материализованное представление, которое можно было построить только на одной таблице. Синхронные материализованные представления, или Rollup, сохраняют большую свежесть данных и более низкие затраты на обновление. Однако по сравнению с асинхронными материализованными представлениями, поддерживаемыми начиная с v1.5.2, синхронные материализованные предст авления имеют много ограничений. У вас есть ограниченный выбор операторов агрегации, когда вы хотите построить синхронное материализованное представление для ускорения или перезаписи ваших запросов.
В следующей таблице сравниваются асинхронные материализованные представления (ASYNC MV) и синхронные материализованные представления (SYNC MV) в Selena с точки зрения поддерживаемых функций:
| Агрегация одной таблицы | Соединение нескольких таблиц | Перезапись запросов | Стратегия обновления | Базовая таблица | |
|---|---|---|---|---|---|
| ASYNC MV | Да | Да | Да |
| Несколько таблиц из:
|
| SYNC MV (Rollup) | Ограниченный выбор агрегатных функций | Нет | Да | Синхронное обновление при загрузке данных | Одна таблица в default catalog |
Основные понятия
-
Базовая таблица
Базовые таблицы являются управляющими таблицами материализованного представления.
Для асинхронных материализованных представлений Selena базовыми таблицами могут быть собственные таблицы Selena в default catalog, таблицы во внешних каталогах (поддерживается с v1.5.2) или даже существующие асинхронные материализованные представления (поддерживается с v1.5.2) и представления (поддерживается с v1.5.2). Selena поддерживает создание асинхронных материализованных представлений на всех типах таблиц Selena.
-
Обновление
При создании асинхронного материализованного представления его данные отражают только состояние базовых таблиц на тот момент. Когда данные в базовых таблицах изменяются, вам нужно обновить материализованное представление, чтобы синхронизировать изменения.
В настоящее время Selena поддерживает две общие стратегии обновления:
- ASYNC: Режим асинхронного обновления. Материализованные представления могут обновляться автоматически при изменении данных в базовой таблице или через регулярные интервалы на основе указанных интервалов.
- MANUAL: Режим ручного обновления. Материализованное представление не будет автоматически обновляться. Задачи обновления могут быть запущены только вручную пользователями.
-
Перезапись запросов
Перезапись запросов означает, что при выполнении запроса к базовым таблицам с построенными на них материализованными представлениями система автоматически определяет, могут ли быть повторно использованы предварительно вычисленные результаты в материализованном представлении для запроса. Если они могут быть повторно использованы, система загрузит данные напрямую из соответствующего материализованного представления, чтобы избежать трудоемких и ресурсоемких вычислений или соединений.
Начиная с v1.5.2, Selena поддерживает автоматическую, прозрачную перезапись запросов на основе асинхронных материализованных представлений типа SPJG. Материализованные представления типа SPJG относятся к материализованным представлениям, план которых включает только операторы типа Scan, Filter, Project и Aggregate.
ПРИМЕЧАНИЕ
Асинхронные материализованные представления, созданные на базовых таблицах в JDBC catalog или Hudi catalog, не поддерживают перезапись запросов.
Определение, когда создавать материализованное представление
Вы можете создать асинхронное материализованное представление, если у вас есть следующие требования в вашей среде хранилища данных:
-
Ускорение запросов с повторяющимися агрегатными функциями
Предположим, что большинство запросов в вашем хранилище данных включают один и тот же подзапрос с агрегатной функцией, и эти запросы потребляли огромную долю ваших вычислительных ресурсов. На основе этого подзапроса вы можете создать асинхронное материализованное представление, которое будет вычислять и хранить все результаты подзапроса. После создания материализованного представления Selena переписывает все запросы, содержащие подзапрос, загружает промежуточные результаты, хранящиеся в материализованном представлении, и таким образом ускоряет эти запросы.
-
Регулярное соединение нескольких таблиц
Предположим, что вам нужно регулярно соединять несколько таблиц в вашем хранилище данных, чтобы создать новую широкую таблицу. Вы можете построить асинхронное материализованное представление для этих таблиц и установить стратегию обновления ASYNC, которая запускает задачи обновления через фиксированный временной интервал. После создания материализованного представления результаты запроса возвращаются напрямую из материализованного представления, и таким образом избегается задержка, вызванная операциями JOIN.
-
Послойное хранилище данных
Предположим, что ваше хранилище данных содержит массу необработанных данных, и запросы в нем требуют сложного набора операций ETL. Вы можете построить несколько уровней асинхронных материализованных представлений для стратификации данных в вашем хранилище данных и таким образом разбить запрос на серию простых подзапросов. Это может значительно сократить повторяющиеся вычисления и, что более важно, помочь вашему администратору баз данных легко и эффективно выявлять проблемы. Кроме того, послойное хранилище данных помогает разделить необработанные данные и статистические данные, защищая безопасность конфиденциальных необработанных данных.
-
Ускорение запросов в озерах данных
Запросы к озеру данных могут быть медленными из-за задержки сети и пропускной способности объектного хранилища. Вы можете повысить производительность запросов, построив асинхронное материализованное представление поверх озера данных. Более того, Selena может интеллектуально переписывать запросы для использования существующих материализованных представлений, избавляя вас от необходимости изменять запросы вручную.
Для конкретных случаев использования асинхронных материализованных представлений обратитесь к следующему соде ржанию:
Создание асинхронного материализованного представления
Асинхронные материализованные представления Selena могут быть созданы на следующих базовых таблицах:
- Собственные таблицы Selena (поддерживаются все типы таблиц Selena)
- Таблицы во внешних каталогах
- Существующие асинхронные материализованные представления (с v1.5.2)
- Существующие представления (с v1.5.2)
Прежде чем начать
Следующие примеры включают две базовые таблицы в default catalog:
- Таблица
goodsзаписывает идентификатор товараitem_id1, название товараitem_nameи цену товараprice. - Таблица
order_listзаписывает идентификатор заказаorder_id, идентификатор клиентаclient_id, идентификатор товараitem_id2и дату заказаorder_date.
Столбец goods.item_id1 эквивалентен столбцу order_list.item_id2.
Выполните следующие инструкции для создания таблиц и вставки данных в них:
CREATE TABLE goods(
item_id1 INT,
item_name STRING,
price FLOAT
) DISTRIBUTED BY HASH(item_id1);
INSERT INTO goods
VALUES
(1001,"apple",6.5),
(1002,"pear",8.0),
(1003,"potato",2.2);
CREATE TABLE order_list(
order_id INT,
client_id INT,
item_id2 INT,
order_date DATE
) DISTRIBUTED BY HASH(order_id);
INSERT INTO order_list
VALUES
(10001,101,1001,"2022-03-13"),
(10001,101,1002,"2022-03-13"),
(10002,103,1002,"2022-03-13"),
(10002,103,1003,"2022-03-14"),
(10003,102,1003,"2022-03-14"),
(10003,102,1001,"2022-03-14");
Сценарий в следующем примере требует частых вычислений суммы каждого заказа. Он требует частых соединений двух базовых таблиц и интенсивного использования агрегатной функции sum(). Кроме того, бизнес-сценарий требует обновления данных с интервалом в один день.
Инструкция запроса следующая:
SELECT
order_id,
sum(goods.price) as total
FROM order_list INNER JOIN goods ON goods.item_id1 = order_list.item_id2
GROUP BY order_id;