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

CREATE ASYNC MATERIALIZED VIEW

Описание​

Оператор создания асинхронного материализованного представления. Имена и типы столбцов определяются на основе SQL-оператора материализованного представления. Можно задавать собственные имена столбцов, но нельзя определять их типы.

Синтаксис​

CREATE MATERIALIZED VIEW 
[ IF NOT EXISTS ] <materialized_view_name>
[ (<columns_definition>) ]
[ BUILD <build_mode> ]
[ REFRESH <refresh_method> [FALLBACK] [<refresh_trigger>]]
[ [DUPLICATE] KEY (<key_cols>) ]
[ COMMENT '<table_comment>' ]
[ PARTITION BY (
{ <partition_col>
| DATE_TRUNC(<partition_col>, <partition_unit>) }
)]
[ DISTRIBUTED BY { HASH (<distribute_cols>) | RANDOM }
[ BUCKETS { <bucket_count> | AUTO } ]
]
[ PROPERTIES (
-- Table property
<table_property>
-- Additional table properties
[ , ... ])
]
AS <query>

Где:

columns_definition
: -- Column definition
<col_name>
[ COMMENT '<col_comment>' ]
refresh_trigger
: ON MANUAL
| ON SCHEDULE EVERY <int_value> <refresh_unit> [ STARTS '<start_time>']
| ON COMMIT
refresh_method
: COMPLETE
| AUTO
| INCREMENTAL
| PARTITIONS

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

1. <materialized_view_name>

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

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

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

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

2. <query>

Обязательный параметр при создании материализованного представления. Задаёт оператор SELECT, который заполняет представление данными.

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

1. <key_cols>

Ключевые столбцы таблицы. В Doris ключевыми должны быть первые K столбцов таблицы. Подробнее об ограничениях для ключей и выборе ключевых столбцов см. соответствующие разделы главы «Модель данных».

2. <build_mode>

Время обновления: следует ли обновлять материализованное представление сразу после создания.

IMMEDIATE: обновить немедленно. По умолчанию используется IMMEDIATE.

DEFERRED: отложенное обновление.

3. <refresh_method>

Метод обновления:

COMPLETE: обновить все партиции.

PARTITIONS: обнаруживает изменения в партициях базовой таблицы и пересчитывает затронутые партиции материализованного представления. Требует наличия PARTITION BY в определении материализованного представления.

INCREMENTAL: использует Incremental View Maintenance (IVM) для обработки изменений на уровне строк в базовых таблицах между двумя обновлениями. Доступен начиная с Doris 5.0.0 и пока является экспериментальным.

AUTO: Doris автоматически выбирает доступный метод обновления. Для материализованных представлений, соответствующих требованиям IVM, последовательно пробует IVM, обновление партиций и полное обновление.

Укажите FALLBACK после INCREMENTAL или PARTITIONS, чтобы разрешить переход к методу обновления с более крупной гранулярностью во время выполнения. При использовании INCREMENTAL FALLBACK на этапе создания по-прежнему строго проверяется, соответствует ли определение требованиям IVM. Подробнее см. Инкрементальное обслуживание представлений (IVM).

Примечание

Если партиционированное материализованное представление использует режим обновления COMPLETE, выполняется полное обновление данных всех партиций, и представление фактически ведёт себя как непартиционированное.

4. <refresh_trigger>

Способ запуска:

MANUAL: обновление вручную.

ON SCHEDULE: обновление по расписанию.

ON COMMIT: обновление по событию, при котором изменения данных базовой таблицы запускают обновление материализованного представления.

5. <refresh_unit>

Единица времени для периодических обновлений. В настоящее время поддерживаются MINUTE, HOUR, DAY и WEEK.

6. <partition_col>

Если PARTITION BY не указан, по умолчанию создаётся только одна партиция.

Если задано поле партиционирования, система автоматически определяет, из какой базовой таблицы оно взято, и выполняет синхронизацию с базовой таблицей (в настоящее время поддерживаются внутренние таблицы и таблицы Hive). Для внутренних таблиц допускается только одно поле партиционирования.

Материализованные представления также могут уменьшать количество партиций за счёт их укрупнения. В настоящее время для укрупнения партиций поддерживается функция date_trunc.

7. <partition_unit>

Гранулярность агрегации при укрупнении партиций. В настоящее время поддерживаются HOUR, DAY, WEEK, QUARTER, MONTH и YEAR.

8. <start_time>

Время начала обновлений по расписанию должно быть в будущем, то есть позже текущего времени.

9. <table_property>

Большинство свойств внутренних таблиц можно использовать и для материализованных представлений. Ниже перечислены эти свойства, а также свойства, специфичные для материализованных представлений:

Имя свойстваОписание
grace_periodМаксимально допустимое отставание данных материализованного представления в секундах при переписывании запросов. Если данные партиции A материализованного представления не согласованы с данными базовой таблицы, а последнее обновление партиции A произошло в 10:15:00 при текущем системном времени 10:15:08, эта партиция не будет использоваться для прозрачного переписывания запросов. Однако если для grace_period задано значение 10, партиция будет использоваться для прозрачного переписывания.
excluded_trigger_tablesИмена таблиц, разделённые запятыми, которые следует игнорировать при обновлении данных. Например, table1,table2.
refresh_partition_numКоличество партиций, обновляемых одним оператором INSERT; по умолчанию 1. При обновлении материализованного представления сначала вычисляется список партиций для обновления, затем они распределяются между несколькими операторами INSERT для последовательного выполнения. Если оператор INSERT завершается ошибкой, вся задача останавливается. Материализованное представление обеспечивает атомарность отдельного оператора INSERT, а ошибка INSERT не влияет на партиции, которые уже были успешно обновлены.
workload_groupИмя workload_group, используемой при выполнении задач обновления материализованного представления. Это позволяет ограничить ресурсы, потребляемые материализованным представлением при обновлении данных, чтобы не влиять на другие рабочие процессы. Подробнее о создании и использовании workload_group см. документацию WORKLOAD-GROUP.
ivm_use_full_keysОпределяет, следует ли добавлять ключи, идентифицирующие исходные строки, в Unique Key IVM. По умолчанию false. Снижает риск коллизий хешей для составных идентификаторов строк, но увеличивает ширину ключа и затраты на хранение. Можно задать только при создании IVM.
ivm_partition_window_limitОграничивает обслуживание IVM последними N партициями указанных базовых таблиц. Формат: table:N, несколько таблиц разделяются запятыми. Инкрементальные изменения за пределами окна игнорируются, поэтому эта настройка допускает потерю части изменений; COMPLETE по-прежнему считывает базовые таблицы целиком.
partition_sync_limitЕсли поле партиционирования базовой таблицы имеет временной тип, это свойство вместе с partition_sync_time_unit позволяет настроить диапазон партиций для синхронизации с базовой таблицей. Например, значение 2 при partition_sync_time_unit, равном MONTH, означает, что будут синхронизироваться только партиции и данные базовой таблицы за последние 2 месяца. Минимальное значение: 1. С течением времени материализованное представление будет автоматически добавлять и удалять партиции при каждом обновлении. Например, если материализованное представление сейчас содержит данные за месяцы 2 и 3, в следующем месяце оно автоматически удалит данные за месяц 2 и добавит данные за месяц 4.
partition_sync_time_unitЕдиница времени для обновления партиций. Поддерживаются DAY/MONTH/YEAR (по умолчанию DAY).
partition_date_formatЕсли поле партиционирования базовой таблицы имеет строковый тип и требуется использовать возможность partition_sync_limit, можно задать формат даты для разбора времени партиции в соответствии с настройкой partition_date_format.
enable_nondeterministic_functionОпределяет, может ли SQL-определение материализованного представления содержать недетерминированные функции, например current_date(), now(), random() и т. д. Значение true разрешает их использование; в противном случае они запрещены. По умолчанию использование запрещено.
use_for_rewriteОпределяет, участвует ли это материализованное представление в прозрачном переписывании запросов. При значении false оно не участвует в прозрачном переписывании. По умолчанию true. В сценариях моделирования данных, если материализованное представление используется только для прямых запросов, это свойство позволяет исключить его из прозрачного переписывания и тем самым ускорить выполнение запросов.
Примечание

До Apache Doris 2.1.10 предложение DISTRIBUTED BY обязательно: его отсутствие вызывает ошибку. Начиная с Apache Doris 2.1.10, если оно не указано, по умолчанию используется распределение RANDOM.

Примечание

До Apache Doris 2.1.10/3.0.6 свойство excluded_trigger_tables поддерживало указание только имён базовых таблиц. Начиная с этих версий поддерживаются полные имена таблиц, включающие Catalog и базу данных (например, internal.db1.table1).

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

Пользователь, выполняющий эту SQL-команду, должен обладать как минимум следующими правами:

ПривилегияОбъектПримечания
CREATE_PRIVБаза данных
SELECT_PRIVТаблица, представлениеТребуется право SELECT_PRIV на таблицы или представления, к которым обращается запрос в <query>

Примечания​

  • Ограничения DML и DDL для материализованных представлений:

    Материализованные представления не поддерживают изменение схемы, например изменение типов столбцов, добавление или удаление столбцов, поскольку столбцы определяются на основе SQL-определения материализованного представления.

    Материализованные представления не поддерживают ручные операции insert into и insert overwrite.

  • Условия создания партиционированных материализованных представлений:

    Для выполнения инкрементальных обновлений по партициям SQL-определение материализованного представления и поле партиционирования должны соответствовать следующим условиям:

    1. Хотя бы одна из базовых таблиц, используемых материализованным представлением, должна быть партиционированной.
    2. Партиционированная базовая таблица, используемая материализованным представлением, должна применять стратегию партиционирования List или Range.
    3. В SQL-определении материализованного представления предложение Partition By может содержать только одно поле партиционирования.
    4. Поле партиционирования из предложения Partition By в SQL-определении материализованного представления должно быть указано после Select.
    5. Если SQL-определение материализованного представления использует Group By, поле партиционирования должно быть указано после Group By.
    6. Если SQL-определение материализованного представления использует оконную функцию Window, поле партиционирования должно быть указано после Partition By.
    7. Изменения данных должны происходить в партиционированной таблице; если они происходят в непартиционированной таблице, материализованное представление требует полного построения.
    8. Если материализованное представление использует в качестве поля партиционирования поле со стороны Join, для которой генерируются значения NULL, оно не может выполнять инкрементальные обновления по партициям. Например, для LEFT OUTER JOIN поле партиционирования должно находиться слева, а не
  • Условия создания IVM

    REFRESH INCREMENTAL требует, чтобы для базовых таблиц был включён changelog, а SQL-определение материализованного представления входило в область поддержки IVM. Если явно указан INCREMENTAL, неподдерживаемое определение приводит к ошибке создания. Сведения о моделях базовых таблиц и переключателях FE см. в разделе Предварительные требования IVM, а сведения об операторах запросов и агрегатных функциях см. в разделе Запросы, поддерживаемые IVM.

Примеры​

Создание IVM​

```sql
CREATE MATERIALIZED VIEW orders_by_status
BUILD DEFERRED
REFRESH INCREMENTAL FALLBACK ON MANUAL
DISTRIBUTED BY RANDOM BUCKETS 1
AS
SELECT order_status, COUNT(*) AS order_count, SUM(amount) AS total_amount
FROM orders
GROUP BY order_status;
```

Run `REFRESH MATERIALIZED VIEW orders_by_status COMPLETE` once after creation to build the full baseline, then run incremental refreshes.
  1. Непартиционированное материализованное представление

CREATE MATERIALIZED VIEW complete_mv (
orderdate COMMENT 'Order date',
orderkey COMMENT 'Order key',
partkey COMMENT 'Part key'
)
BUILD IMMEDIATE
REFRESH AUTO
ON SCHEDULE EVERY 1 DAY STARTS '2024-12-01 20:30:00'
DISTRIBUTED BY HASH (orderkey) BUCKETS 2
PROPERTIES
("replication_num" = "1")
AS
SELECT
o_orderdate,
l_orderkey,
l_partkey
FROM
orders
LEFT JOIN lineitem ON l_orderkey = o_orderkey
LEFT JOIN partsupp ON ps_partkey = l_partkey
and l_suppkey = ps_suppkey;
  1. Партиционированное материализованное представление

Как показано ниже, если указан столбец партиционирования, система автоматически определяет, из какой базовой таблицы он взят, и синхронизирует партиции базовой таблицы. Базовая таблица партиционирована по дням (столбец партиционирования: o_orderdate, тип партиционирования: RANGE). Материализованное представление партиционировано по месяцам: функция DATE_TRUNC укрупняет партиции базовой таблицы до месячных.

CREATE TABLE IF NOT EXISTS orders  (
o_orderkey integer not null,
o_custkey integer not null,
o_orderstatus char(1) not null,
o_totalprice decimalv3(15,2) not null,
o_orderdate date not null,
o_orderpriority char(15) not null,
o_clerk char(15) not null,
o_shippriority integer not null,
o_comment varchar(79) not null
)
DUPLICATE KEY(o_orderkey, o_custkey)
PARTITION BY RANGE(o_orderdate)(
FROM ('2023-10-16') TO ('2023-11-30') INTERVAL 1 DAY
)
DISTRIBUTED BY HASH(o_orderkey) BUCKETS 3
PROPERTIES (
"replication_num" = "3"
);
CREATE MATERIALIZED VIEW partition_mv
BUILD IMMEDIATE
REFRESH AUTO
ON SCHEDULE EVERY 1 DAY STARTS '2024-12-01 20:30:00'
PARTITION BY (DATE_TRUNC(o_orderdate, 'MONTH'))
DISTRIBUTED BY HASH (l_orderkey) BUCKETS 2
PROPERTIES
("replication_num" = "3")
AS
SELECT
o_orderdate,
l_orderkey,
l_partkey
FROM
orders
LEFT JOIN lineitem ON l_orderkey = o_orderkey
LEFT JOIN partsupp ON ps_partkey = l_partkey
and l_suppkey = ps_suppkey;

В следующем примере создать партиционированное материализованное представление нельзя, поскольку для столбца партиционирования используется функция, отличная от date_trunc. Сообщение об ошибке: because column to check use invalid implicit expression, invalid expression is min(o_orderdate#4)

CREATE MATERIALIZED VIEW partition_mv_2
BUILD IMMEDIATE
REFRESH AUTO
ON SCHEDULE EVERY 1 DAY STARTS '2024-12-01 20:30:00'
PARTITION BY (DATE_TRUNC(min_orderdate, 'MONTH'))
DISTRIBUTED BY HASH (l_orderkey) BUCKETS 2
PROPERTIES
("replication_num" = "3")
AS
SELECT
min(o_orderdate) AS min_orderdate,
l_orderkey,
l_partkey
FROM
orders
LEFT JOIN lineitem ON l_orderkey = o_orderkey
LEFT JOIN partsupp ON ps_partkey = l_partkey
and l_suppkey = ps_suppkey
GROUP BY
o_orderdate,
l_orderkey,
l_partkey;
  1. Изменение свойств материализованного представления. Используйте оператор ALTER MATERIALIZED VIEW.

Например:

ALTER MATERIALIZED VIEW partition_mv
SET (
"grace_period" = "10",
"excluded_trigger_tables" = "lineitem,partsupp"
);
  1. Изменение режима обновления материализованного представления. Используйте оператор ALTER MATERIALIZED VIEW. Например:
ALTER MATERIALIZED VIEW partition_mv REFRESH COMPLETE;
After running SHOW CREATE MATERIALIZED VIEW partition_mv;, you can see that the refresh mode has been changed to COMPLETE.