Перейти к содержимому
Последнее обновление

CREATE SYNC MATERIALIZED VIEW

Описание​

Оператор создания синхронного материализованного представления.

Синтаксис​

CREATE MATERIALIZED VIEW <materialized_view_name> [AS] <query>            

Где

query
:
SELECT <select_expr> select_expr[, select_expr ...]
FROM <base_table>
WHERE condition
GROUP BY <column_name>[, <column_name> ...]
ORDER BY <column_name>[, <column_name> ...]

Обязательные параметры​

1. <materialized_view_name>

Задаёт идентификатор (то есть имя) материализованного представления. Поскольку синхронное материализованное представление создаётся на основе таблицы, его имя должно быть уникальным в пределах этой таблицы.

Идентификатор должен начинаться с буквы (если включена поддержка имён Unicode, это может быть символ любого языка) и не может содержать пробелы или специальные символы, если только вся строка идентификатора не заключена в обратные кавычки (например, My Object).

Идентификатор не может быть зарезервированным ключевым словом.

Подробнее см. требования к идентификаторам и зарезервированным ключевым словам.

2. <query>

Запрос, используемый для построения материализованного представления. Результат этого запроса составляет данные материализованного представления. В настоящее время поддерживается следующий формат запроса:

Синтаксис соответствует синтаксису оператора запроса.

  • select_expr: все столбцы в схеме материализованного представления.
    • Должен включать хотя бы один отдельный столбец.
  • base_table: имя базовой таблицы материализованного представления. Обязательный элемент.
    • Должна быть указана одна таблица, а не подзапрос.
  • where: условие фильтрации материализованного представления. Необязательный элемент.
    • Если не указано, данные не фильтруются.
  • group by: столбцы группировки материализованного представления. Необязательный элемент.
    • Если не указаны, данные не группируются.
  • order by: столбцы сортировки материализованного представления. Необязательный элемент.
    • Порядок объявления столбцов сортировки должен соответствовать порядку столбцов, объявленных в select_expr.
    • Если order by не указан, столбцы сортировки добавляются автоматически по следующим правилам. Если материализованное представление имеет агрегатный тип, все столбцы группировки автоматически добавляются в качестве столбцов сортировки. Если материализованное представление имеет неагрегатный тип, в качестве столбцов сортировки автоматически добавляются первые 36 байт.
    • Если количество автоматически добавленных столбцов сортировки меньше 3, в качестве столбцов сортировки используются первые три столбца. Если запрос содержит столбцы группировки, столбцы сортировки должны соответствовать столбцам группировки.

Требования к правам доступа​

ПривилегияОбъектПримечания
ALTER_PRIVТаблицаТребуется право ALTER_PRIV на базовую таблицу текущего материализованного представления

Примечания​

  • Имена столбцов в списке SELECT синхронного материализованного представления не должны совпадать с именами существующих столбцов базовой таблицы или с именами столбцов других синхронных материализованных представлений на той же базовой таблице. Чтобы избежать конфликтов имён, можно задать псевдонимы (например, col as xxx).
  • Синхронные материализованные представления поддерживают только операторы SELECT для одной таблицы. Поддерживаются предложения WHERE, GROUP BY и ORDER BY, но не JOIN, HAVING, LIMIT или LATERAL VIEW.
  • Список SELECT не может содержать столбцы с автоинкрементом, константы, повторяющиеся выражения или оконные функции.
  • Если список SELECT содержит агрегатные функции, они должны быть корневыми выражениями (например, sum(a + 1) поддерживается, а sum(a) + 1 не поддерживается). После агрегатных функций не могут следовать другие выражения, не являющиеся агрегатными функциями (например, SELECT x, sum(a) допустимо, а SELECT sum(a), x недопустимо).
  • Слишком большое количество материализованных представлений на одной таблице может снизить эффективность импорта данных: при импорте данные материализованных представлений и базовой таблицы обновляются синхронно. Если у таблицы слишком много материализованных представлений, импорт может замедлиться, как при одновременном импорте данных в несколько таблиц в рамках одной операции.
  • Если материализованное представление создаётся для модели данных Unique Key, оно может только изменять порядок столбцов и не может выполнять агрегацию. Поэтому в модели Unique Key нельзя агрегировать данные до более крупного уровня детализации путём создания материализованных представлений.
  • Если материализованное представление создаётся для модели данных Unique Key или Aggregate Key и содержит предложение WHERE, в нём можно использовать только столбцы Key, но не столбцы Value.

Пример​

Подготовка: в примере ниже используется стандартная базовая таблица TPC-H lineitem:

CREATE TABLE IF NOT EXISTS lineitem (
l_orderkey INT NOT NULL,
l_partkey INT NOT NULL,
l_suppkey INT NOT NULL,
l_linenumber INT NOT NULL,
l_quantity DECIMAL(15,2) NOT NULL,
l_extendedprice DECIMAL(15,2) NOT NULL,
l_discount DECIMAL(15,2) NOT NULL,
l_tax DECIMAL(15,2) NOT NULL,
l_returnflag CHAR(1) NOT NULL,
l_linestatus CHAR(1) NOT NULL,
l_shipdate DATE NOT NULL,
l_commitdate DATE NOT NULL,
l_receiptdate DATE NOT NULL,
l_shipinstruct CHAR(25) NOT NULL,
l_shipmode CHAR(10) NOT NULL,
l_comment VARCHAR(44) NOT NULL
)
DUPLICATE KEY (l_orderkey, l_partkey, l_suppkey, l_linenumber)
DISTRIBUTED BY HASH (l_orderkey) BUCKETS 1
PROPERTIES ("replication_num" = "1");
desc lineitem;
+-----------------+---------------+------+-------+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+---------------+------+-------+---------+-------+
| l_orderkey | int | No | true | NULL | |
| l_partkey | int | No | true | NULL | |
| l_suppkey | int | No | true | NULL | |
| l_linenumber | int | No | true | NULL | |
| l_quantity | decimal(15,2) | No | false | NULL | NONE |
| l_extendedprice | decimal(15,2) | No | false | NULL | NONE |
| l_discount | decimal(15,2) | No | false | NULL | NONE |
| l_tax | decimal(15,2) | No | false | NULL | NONE |
| l_returnflag | char(1) | No | false | NULL | NONE |
| l_linestatus | char(1) | No | false | NULL | NONE |
| l_shipdate | date | No | false | NULL | NONE |
| l_commitdate | date | No | false | NULL | NONE |
| l_receiptdate | date | No | false | NULL | NONE |
| l_shipinstruct | char(25) | No | false | NULL | NONE |
| l_shipmode | char(10) | No | false | NULL | NONE |
| l_comment | varchar(44) | No | false | NULL | NONE |
+-----------------+---------------+------+-------+---------+-------+
CREATE MATERIALIZED VIEW sync_agg_mv AS
SELECT
l_shipdate as shipdate,
l_partkey as partkey,
count(*),
sum(l_discount)
FROM
lineitem
GROUP BY
l_shipdate,
l_partkey;