1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
# MATERIALIZE
Материализует указанный источник или выражение на текущем или заданном кластере. В случае материализации выражения, его тип должен быть списком структур. Кластер для материализации берется из `ON` выражения или, при его отсутствии, из оператора [USE](use.md).
Материализованный источник сохраняет все колонки и порядок сортировки. Он также создает барьер для оптимизаторов по возможному слиянию вычислений.
## Синтаксис
```yql
MATERIALIZE
<source> -- в качестве источника может быть указано имя таблицы, именованное выражение, вложенный SELECT
INTO $<bind_name> -- имя параметра, по которому можно обращаться к результатам материализации в других местах запроса
ON <cluster> -- имя кластера, на котором будет материализован источник (опциональный)
WITH <hints> -- дополнительные модификаторы (опциональные)
```
## Доступность
`MATERIALIZE` доступен начиная с версии языка [2026.02](../changelog/2026.02.md).
## Использование модификаторов
Материализация может выполняться с одним или несколькими модификаторами. Модификатор указывается после ключевого слова `WITH`.
Действуют следующие правила:
- Если у модификатора есть значение, то оно указывается после знака `=`: `MATERIALIZE ... INTO ... WITH SOME_HINT=value`.
- Если необходимо указать несколько модификаторов, то они заключаются в круглые скобки: `MATERIALIZE ... INTO ... WITH (SOME_HINT1=value, SOME_HINT2, SOME_HINT3=value)`.
Общий список поддерживаемых модификаторов:
* `prune_unused_columns` ‐ удалять из материализованного источника колонки, которые не используются потребителями.
Системы, на кластерах которых выполняется материализация, могут иметь расширенный набор поддерживаемых модификаторов.
## Примеры
```yql
USE cluster;
MATERIALIZE (SELECT 1 as a, 2 as b) INTO $materialized; -- Материализует однострочное выражение на кластере cluster и делает его доступным по имени $materialized
SELECT * FROM $materialized; -- Выборка из материализованного источника
```
```yql
USE cluster;
$input = SELECT key, value FROM my_table ORDER BY key;
MATERIALIZE $input INTO $materialized ON another_cluster; -- Материализует результат SELECT на кластере another_cluster и делает его доступным по имени $materialized.
-- Материализованный источник сохраняет порядок сортировки по key.
SELECT * FROM another_table AS a
JOIN $materialized AS b USING key; -- JOIN с материализованным источником. Выбор стратегии JOIN учитывает сортировку материализованного источника
```
```yql
USE cluster;
$input = SELECT a, b, c, d FROM my_table;
MATERIALIZE $input INTO $materialized WITH prune_unused_columns; -- Материализует результат SELECT с итоговым набором колонок [a, b, c] после оптимизаций.
SELECT a, b FROM $materialized; -- Выборка из материализованного источника с набором используемых колонок [a, b]
SELECT c FROM $materialized; -- Выборка из материализованного источника с набором используемых колонок [c]
```
|