CREATE MATERIALIZED VIEW
CREATE MATERIALIZED VIEW создает материализованное представление. Информацию об использовании материализованных представлений см. в разделах Синхронное материализованное представление и Асинхронное материализованное представление.
ВНИМАНИЕ
Только пользователи с привилегией CREATE MATERIALIZED VIEW в базе данных, где находится базовая таблица, могут создавать материализованные представления.
Создание материализованного представления является асинхронной операцией. Успешное выполнение этой команды означает, что задача создания материализованного представления была успешно отправлена. Вы можете просмотреть статус построения синхронного материализованного представления в базе данных с помощью команды SHOW ALTER MATERIALIZED VIEW, а статус асинхронного материализованного представления — путем запроса к метаданным представлений tasks и task_runs в Information Schema.
Selena поддерживает асинхронные материализованные представления начиная с версии 1.5.0. Основные различия между асинхронными материализованными представлениями и синхронными материализованными представлениями в предыдущих версиях следующие:
| Агрегация одной таблицы | Соединение нескольких таблиц | Перезапись запросов | Стратегия обновления | Базовая таблица | |
|---|---|---|---|---|---|
| ASYNC MV | Да | Да | Да |
| Несколько таблиц из:
|
| SYNC MV (Rollup) | Ограниченный выбор агрегатных функций | Нет | Да | Синхронное обновление во время загрузки данных | Одна таблица в default catalog |
Синхронное материализованное представление
Синтаксис
CREATE MATERIALIZED VIEW [IF NOT EXISTS] [database.]<mv_name>
[COMMENT ""]
[PROPERTIES ("key"="value", ...)]
AS
<query_statement>
Параметры в квадратных скобках [] являются необязательными.
Параметры
mv_name (обязательный)
Имя материализованного представления. Требования к именованию следующие:
- Имя должно состоять из букв (a-z или A-Z), цифр (0-9) или подчеркиваний (_), и может начинаться только с буквы.
- Длина имени не может превышать 64 символа.
- Имя чувствительно к регистру.
COMMENT (необязательный)
Комментарий к материализованному представлению. Обратите внимание, что COMMENT должен быть размещен после mv_name. В противном случае материализованное представление не может быть создано.
query_statement (обязательный)
Запрос для создания материализованного представления. Его результат является данными в материализованном представлении. Синтаксис следующий:
SELECT select_expr[, select_expr ...]
[WHERE where_expr]
[GROUP BY column_name[, column_name ...]]
[ORDER BY column_name[, column_name ...]]
-
select_expr (обязательный)
Все столбцы в запросе, то есть все столбцы в схеме материализованного представления. Этот параметр поддерживает следующие значения:
- Простые столбцы или агрегатные столбцы, такие как
SELECT a, abs(b), min(c) FROM table_a, гдеa,bиc— имена столбцов в базовой таблице. Если вы не указываете имена столбцов для материализованного представления, Selena автоматически присваивает имена столбцам. - Выражения, такие как
SELECT a+1 AS x, b+2 AS y, c*c AS z FROM table_a, гдеa+1,b+2иc*c— выражения, которые ссылаются на столбцы в базовых таблицах, аx,yиz— псевдонимы, присвоенные столбцам в материализованном представлении.
ПРИМЕЧАНИЕ
- Вы должны указать как минимум один столбец в
select_expr. - При создании синхронного материализованного представления с агрегатной функцией вы должны указать предложение GROUP BY и указать как минимум один столбец GROUP BY в
select_expr. - Синхронные материализованные представления не поддерживают предложения, такие как JOIN и предложение HAVING в GROUP BY.
- Начиная с версии 1.5.0, каждое синхронное материализованное представление может поддерживать более одной агрегатной функции для каждого столбца базовой таблицы, например, запросы вида
select b, sum(a), min(a) from table group by b. - Начиная с версии 1.5.0, синхронные материализованные представления поддерживают сложные выражения для SELECT и агрегатных функций, например, запросы вида
select b, sum(a + 1) as sum_a1, min(cast (a as bigint)) as min_a from table group by bилиselect abs(b) as col1, a + 1 as col2, cast(a as bigint) as col3 from table. На сложные выражения, используемые для синхронных материализованных представлений, накладываются следующие ограничения:- Каждое сложное выражение должно иметь псевдоним, и разные псевдонимы должны быть присвоены разным сложным выражениям среди всех синхронных материализованных представлений базовой таблицы. Например, запросы
select b, sum(a + 1) as sum_a from table group by bиselect b, sum(a) as sum_a from table group by bне могут использоваться для создания синхронных материализованных представлений для одной и той же базовой таблицы. Вы можете установить разные псевдонимы для сложного выражения. - Вы можете проверить, перезаписываются ли ваши запросы синхронными материализованными представлениями, созданными со сложными выражениями, выполнив
EXPLAIN <sql_statement>. Для получения дополнительной информации см. Анализ запросов.
- Каждое сложное выражение должно иметь псевдоним, и разные псевдонимы должны быть присвоены разным сложным выражениям среди всех синхронных материализованных представлений базовой таблицы. Например, запросы
- Простые столбцы или агрегатные столбцы, такие как
-
WHERE (необязательный)
Начиная с версии 1.5.0, синхронные материализованные представления поддерживают предложение WHERE, которое может фильтровать строки, используемые для материализованного представления.
-
GROUP BY (необязательный)
Столбец GROUP BY запроса. Если этот параметр не указан, данные не будут группироваться по умолчанию.
-
ORDER BY (необязательный)
Столбец ORDER BY запроса.
- Столбцы в предложении ORDER BY должны быть объявлены в том же порядке, что и столбцы в
select_expr. - Если запрос содержит предложение GROUP BY, столбцы ORDER BY должны быть идентичны столбцам GROUP BY.
- Если этот параметр не указан, система автоматически дополнит столбец ORDER BY согласно следующим правилам:
- Если материализованное представление имеет тип AGGREGATE, все столбцы GROUP BY автоматически используются как ключи сортировки.
- Если материализованное представление не имеет тип AGGREGATE, Selena автоматически выбирает ключи сортировки на основе префиксных столбцов.
- Столбцы в предложении ORDER BY должны быть объявлены в том же порядке, что и столбцы в
Запрос синхронного материализованного представления
Поскольку синхронное материализованное представление по сути является индексом базовой таблицы, а не физической таблицей, вы можете запрашивать синхронное материализованное представление только с использованием подсказки [_SYNC_MV_]:
-- Не опускайте квадратные скобки [] в подсказке.
SELECT * FROM <mv_name> [_SYNC_MV_];
ВНИМАНИЕ
В настоящее время Selena автоматически генерирует имена для столбцов в синхронном материализованном представлении, даже если вы указали для них псевдонимы.
Автоматическая перезапись запросов с синхронным материализованным представлением
Когда выполняется запрос, который следует шаблону синхронного материализованного представления, исходный запрос автоматически перезаписывается и используются промежуточные результаты, хранящиеся в материализованном представлении.
В следующей таблице показано соответствие между агрегатной функцией в исходном запросе и агрегатной функцией, используемой для построения материализованного представления. Вы можете выбрать соответствующую агрегатную функцию для построения материализованного представления в соответствии с вашим бизнес-сценарием.
| агрегатная функция в исходном запросе | агрегатная функция материализованного представления |
|---|---|
| sum | sum |
| min | min |
| max | max |
| count | count |
| bitmap_union, bitmap_union_count, count(distinct) | bitmap_union |
| hll_raw_agg, hll_union_agg, ndv, approx_count_distinct | hll_union |
| percentile_approx, percentile_union | percentile_union |