Синхронное материализованное представление
Эта тема описывает, как создавать, использовать и управлять синхронным материализованным представлением (Rollup).
Для синхронного материализованного представления все изменения в базовой таблице одновременно обновляются в соответствующих синхронных материализованных представлениях. Обновление синхронного материализованного представления запускается автоматически. Синхронные материализованные представления значительно недороги в обслуживании и обновлении, что делает их подходящими для прозрачного ускорения запросов агрегации в реальном времени по одной таблице.
Синхронные материализованные представления в Selena могут быть созданы только на одной базовой таблице из default catalog. По сути, они являются специальным индексом для ускорения запросов, а не физической таблицей, как асинхронные материализованные представления.
Начиная с версии 1.5.0, Selena предоставляет асинхронные материализованные представления, которые поддерживают создание на нескольких таблицах и больше операторов агрегации. Для использования асинхронных материализованных представлений см. Асинхронное материализованное представление.
- Синхронные материализованные представления поддерживают WHERE-условия начиная с версии 1.5.0.
- В настоящее время синхронные материализованные представления еще не поддерживаются в кластерах с разделяемыми данными.
Следующая таблица сравнивает асинхронные материализованные представления (ASYNC MVs) в Selena v1.5.2 и синхронные материализованные представления (SYNC MV) с точки зрения функций, которые они поддерживают:
| Агрегация одной таблицы | Соединение нескольких таблиц | Перезапись запросов | Стратегия обновления | Базовая таблица | |
|---|---|---|---|---|---|
| ASYNC MV | Да | Да | Да |
| Несколько таблиц из:
|
| SYNC MV (Rollup) | Ограниченный выбор агрегатных функций | Нет | Да | Синхронное обновление во время загрузки данных | Одна таблица в default catalog |
Основные понятия
-
Базовая таблица
Базовые таблицы являются основными таблицами материализованного представления.
Для синхронных материализованных представлений Selena базовые таблицы должны быть одной нативной таблицей из default catalog. Selena поддерживает создание синхронных материализованных представлений на таблицах Duplicate Key и Aggregate.
-
Обновление
Синхронное материализованное представление обновляется каждый раз, когда изменяются данные в базовой таблице. Вам не нужно запускать обновление вручную.
-
Перезапись запросов
Перезапись запросов означает, что при выполнении запроса к базовым таблицам с построенными на них материализованными представлениями система автоматически определяет, можно ли повторно использовать предварительно вычисленные результаты в материализованном представлении для запроса. Если их можно использовать повторно, система загрузит данные напрямую из соответствующего материализованного представления, чтобы избежать затратных по времени и ресурсам вычислений или соединений.
Синхронные материализованные представления поддерживают перезапись запросов на основе некоторых агрегатных операторов. Для получения дополнительной информации см. Соответствие агрегатных функций.
Подготовка
Перед созданием синхронного материализованного представления проверьте, подходит ли ваше хранилище данных для ускорения запросов через синхронные материализованные представления. Например, проверьте, используют ли запросы повторно определенные подзапросы.
Следующий пример основан на таблице sales_records, которая содержит ID транзакции record_id, ID продавца seller_id, ID магазина store_id, дату sale_date и сумму продажи sale_amt для каждой транзакции. Выполните следующие шаги для создания таблицы и вставки данных в неё:
CREATE TABLE sales_records(
record_id INT,
seller_id INT,
store_id INT,
sale_date DATE,
sale_amt BIGINT
) DISTRIBUTED BY HASH(record_id);
INSERT INTO sales_records
VALUES
(001,01,1,"2022-03-13",8573),
(002,02,2,"2022-03-14",6948),
(003,01,1,"2022-03-14",4319),
(004,03,3,"2022-03-15",8734),
(005,03,3,"2022-03-16",4212),
(006,02,2,"2022-03-17",9515);
Бизнес-сценарий этого примера требует частого анализа сумм продаж различных магазинов. В результате функция sum() используется в каждом запросе, потребляя огромное количество вычислительных ресурсов. Вы можете выполнить запрос, чтобы записать его время, и просмотреть его профиль запроса с помощью команды EXPLAIN.
MySQL > SELECT store_id, SUM(sale_amt)
FROM sales_records
GROUP BY store_id;
+----------+-----------------+
| store_id | sum(`sale_amt`) |
+----------+-----------------+
| 2 | 16463 |
| 3 | 12946 |
| 1 | 12892 |
+----------+-----------------+
3 rows in set (0.02 sec)
MySQL > EXPLAIN SELECT store_id, SUM(sale_amt)
FROM sales_records
GROUP BY store_id;
+-----------------------------------------------------------------------------+
| Explain String |
+-----------------------------------------------------------------------------+
| PLAN FRAGMENT 0 |
| OUTPUT EXPRS:3: store_id | 6: sum |
| PARTITION: UNPARTITIONED |
| |
| RESULT SINK |
| |
| 4:EXCHANGE |
| |
| PLAN FRAGMENT 1 |
| OUTPUT EXPRS: |
| PARTITION: HASH_PARTITIONED: 3: store_id |
| |
| STREAM DATA SINK |
| EXCHANGE ID: 04 |
| UNPARTITIONED |
| |
| 3:AGGREGATE (merge finalize) |
| | output: sum(6: sum) |
| | group by: 3: store_id |
| | |
| 2:EXCHANGE |
| |
| PLAN FRAGMENT 2 |
| OUTPUT EXPRS: |
| PARTITION: RANDOM |
| |
| STREAM DATA SINK |
| EXCHANGE ID: 02 |
| HASH_PARTITIONED: 3: store_id |
| |
| 1:AGGREGATE (update serialize) |
| | STREAMING |
| | output: sum(5: sale_amt) |
| | group by: 3: store_id |
| | |
| 0:OlapScanNode |
| TABLE: sales_records |
| PREAGGREGATION: ON |
| partitions=1/1 |
| rollup: sales_records |
| tabletRatio=10/10 |
| tabletList=12049,12053,12057,12061,12065,12069,12073,12077,12081,12085 |
| cardinality=1 |
| avgRowSize=2.0 |
| numNodes=0 |
+-----------------------------------------------------------------------------+
45 rows in set (0.00 sec)
Можно заметить, что запрос занимает около 0.02 секунды, и никакое синхронное материализованное представление не используется для ускорения запроса, поскольку значение поля rollup в профиле запроса равно sales_records, что является базовой таблицей.
Создание синхронного материализованного представления
Вы можете создать синхронное материализованное представление на основе определенного оператора запроса, используя CREATE MATERIALIZED VIEW.
На основе таблицы sales_records и оператора запроса, упомянутого выше, следующий пример создает синхронное материализованное представление store_amt для анализа суммы продаж в каждом магазине.
CREATE MATERIALIZED VIEW store_amt AS
SELECT store_id, SUM(sale_amt)
FROM sales_records
GROUP BY store_id;
ВНИМАНИЕ
- При использовании агрегатных функций в синхронных материализованных представлениях вы должны использовать условие GROUP BY и указать хотя бы один столбец GROUP BY в вашем списке SELECT.
- Синхронные материализованные представления не поддерживают использование одной агрегатной функции на нескольких столбцах. Операторы запросов в форме
sum(a+b)не поддерживаются.- Синхронные материализованные представления не поддерживают использование нескольких агрегатных функций на одном столбце. Операторы запросов в форме
select sum(a), min(a) from tableне поддерживаются.- JOIN не поддерживается при создании синхронного материализованного представления.
- При использовании ALTER TABLE DROP COLUMN для удаления определенного столбца в базовой таблице необходимо убедиться, что все синхронные материализованные представления базовой таблицы не содержат удаляемый столбец, иначе операция удаления не может быть выполнена. Чтобы удалить столбец, который используется в синхронных материализованных представлениях, сначала нужно удалить все синхронные материализованные представления, содержащие этот столбец, а затем удалить столбец.
- Создание слишком большого количества синхронных материализованных представлений для таблицы повлияет на эффективность загрузки данных. Когда данные загружаются в базовую таблицу, данные в синхронных материализованных представлениях и базовой таблице обновляются синхронно. Если базовая таблица содержит
nсинхронных материализованных представлений, эффективность загрузки данных в базовую таблицу примерно такая же, как загрузка данных вnтаблиц.- В настоящее время Selena не поддерживает созд ание нескольких синхронных материализованных представлений одновременно. Новое синхронное материализованное представление может быть создано только после завершения предыдущего.
Проверка статуса построения синхронного материализованного представления
Создание синхронного материализованного представления является асинхронной операцией. Успешное выполнение CREATE MATERIALIZED VIEW указывает на то, что задача создания материализованного представления была успешно отправлена. Вы можете просмотреть статус построения синхронного материализованного представления в базе данных через SHOW ALTER MATERIALIZED VIEW.
MySQL > SHOW ALTER MATERIALIZED VIEW\G
*************************** 1. row ***************************
JobId: 12090
TableName: sales_records
CreateTime: 2022-08-25 19:41:10
FinishedTime: 2022-08-25 19:41:39
BaseIndexName: sales_records
RollupIndexName: store_amt
RollupId: 12091
TransactionId: 10
State: FINISHED
Msg:
Progress: NULL
Timeout: 86400
1 row in set (0.00 sec)
Раздел RollupIndexName указывает имя синхронного материализованного представления, а раздел State указывает, завершено ли построение.
Прямой запрос к синхронному материализованному представлению
Поскольку синхронное материализованное представление по сути является индексом базовой таблицы, а не физической таблицей, вы можете запросить синхронное материализованное представление только с помощью подсказки [_SYNC_MV_]:
-- Не опускайте квадратны е скобки [] в подсказке.
MySQL > SELECT * FROM store_amt [_SYNC_MV_];
+----------+----------+
| store_id | sale_amt |
+----------+----------+
| 2 | 6948 |
| 3 | 8734 |
| 1 | 4319 |
| 2 | 9515 |
| 3 | 4212 |
| 1 | 8573 |
+----------+----------+
ВНИМАНИЕ
В настоящее время Selena автоматически генерирует имена для столбцов в синхронном материализованном представлении, даже если вы указали для них псевдонимы.
Перезапись и ускорение запросов с помощью синхронного материализованного представления
Созданное вами синхронное материализованное представление содержит полный набор предварительно вычисленных результатов в соответствии с оператором запроса. Последующие запросы используют данные из него. Вы можете выполнить тот же запрос для проверки времени запроса, как вы делали при подготовке.
MySQL > SELECT store_id, SUM(sale_amt)
FROM sales_records
GROUP BY store_id;
+----------+-----------------+
| store_id | sum(`sale_amt`) |
+----------+-----------------+
| 2 | 16463 |
| 3 | 12946 |
| 1 | 12892 |
+----------+-----------------+
3 rows in set (0.01 sec)
Можно заметить, что время запроса сократилось до 0.01 секунды.
Проверка попадания запроса в синхронное материализованное представление
Выполните команду EXPLAIN снова, чтобы проверить, попадает ли запрос в синхронное мат ериализованное представление.
MySQL > EXPLAIN SELECT store_id, SUM(sale_amt) FROM sales_records GROUP BY store_id;
+-----------------------------------------------------------------------------+
| Explain String |
+-----------------------------------------------------------------------------+
| PLAN FRAGMENT 0 |
| OUTPUT EXPRS:3: store_id | 6: sum |
| PARTITION: UNPARTITIONED |
| |
| RESULT SINK |
| |
| 4:EXCHANGE |
| |
| PLAN FRAGMENT 1 |
| OUTPUT EXPRS: |
| PARTITION: HASH_PARTITIONED: 3: store_id |
| |
| STREAM DATA SINK |
| EXCHANGE ID: 04 |
| UNPARTITIONED |
| |
| 3:AGGREGATE (merge finalize) |
| | output: sum(6: sum) |
| | group by: 3: store_id |
| | |
| 2:EXCHANGE |
| |
| PLAN FRAGMENT 2 |
| OUTPUT EXPRS: |
| PARTITION: RANDOM |
| |
| STREAM DATA SINK |
| EXCHANGE ID: 02 |
| HASH_PARTITIONED: 3: store_id |
| |
| 1:AGGREGATE (update serialize) |
| | STREAMING |
| | output: sum(5: sale_amt) |
| | group by: 3: store_id |
| | |
| 0:OlapScanNode |
| TABLE: sales_records |
| PREAGGREGATION: ON |
| partitions=1/1 |
| rollup: store_amt |
| tabletRatio=10/10 |
| tabletList=12092,12096,12100,12104,12108,12112,12116,12120,12124,12128 |
| cardinality=6 |
| avgRowSize=2.0 |
| numNodes=0 |
+-----------------------------------------------------------------------------+
45 rows in set (0.00 sec)
Можно заметить, что значение раздела rollup в профиле запроса теперь store_amt, что является созданным вами синхронным материализованным представлением. Это означает, что этот запрос попал в синхронное материализованное представление.