materialize()
Область применения: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Записывает значение табличного выражения в течение длительности выполнения запроса, чтобы его можно было ссылаться несколько раз запросом без пересчета.
Синтаксис
materialize(
выражение)
Дополнительные сведения о соглашениях синтаксиса.
Параметры
Имя (название) | Type | Обязательно | Описание |
---|---|---|---|
выражение | string |
✔️ | Табличное выражение, вычисляемое и кэшированное во время выполнения запроса. |
Замечания
Эта materialize()
функция полезна в следующих сценариях:
- Чтобы ускорить запросы, выполняющие тяжелые вычисления, результаты которых используются несколько раз в запросе.
- Чтобы оценить табличное выражение только один раз и использовать его много раз в запросе. Это обычно требуется, если табличное выражение не детерминировано. Например, если выражение использует
rand()
функции илиdcount()
функции.
Примечание.
Materialize имеет ограничение размера кэша в 5 ГБ. Это ограничение равно узлу кластера и является взаимным для всех запросов, выполняющихся одновременно. Если запрос использует materialize()
и кэш не может содержать больше данных, запрос будет прерваться с ошибкой.
Совет
Другим способом выполнения материализации табличного выражения является использование hint.materialized
флага оператора как оператора и оператора секционирования. Все они совместно используют один кэш материализации.
Совет
- Отправьте все возможные операторы, которые сокращают материализованный набор данных и сохраняют семантику запроса. Например, используйте общие фильтры на вершине одного материализованного выражения.
- Используйте материализацию с присоединением или объединением, если их операнды имеют взаимные вложенные запросы, которые можно выполнить один раз. Например, соединение или объединение ног. См . пример использования оператора соединения.
- Материализация может использоваться только в инструкциях let, если вы даете кэшированному результату имя. Пример использования инструкций let).
Примеры улучшения производительности запросов
В следующем примере показано, как materialize()
можно использовать для повышения производительности запроса.
Выражение _detailed_data
определяется с помощью materialize()
функции, поэтому вычисляется только один раз.
let _detailed_data = materialize(StormEvents | summarize Events=count() by State, EventType);
_detailed_data
| summarize TotalStateEvents=sum(Events) by State
| join (_detailed_data) on State
| extend EventPercentage = Events*100.0 / TotalStateEvents
| project State, EventType, EventPercentage, Events
| top 10 by EventPercentage
Выходные данные
Штат | EventType | EventPercentage | События |
---|---|---|---|
ГАВАЙСКИЕ ВОДЫ | Waterspout | 100 | 2 |
ОЗЕРО ОНТАРИО | Морской гроза ветер | 100 | 8 |
ЗАЛИВ АЛЯСКИ | Waterspout | 100 | 4 |
АТЛАНТИЧЕСКИЙ СЕВЕР | Морской гроза ветер | 95.2127659574468 | 179 |
LAKE ERIE | Морской гроза ветер | 92.5925925925926 | 25 |
E PACIFIC | Waterspout | 90 | 9 |
ОЗЕРО МИЧИГАН | Морской гроза ветер | 85.1648351648352 | 155 |
ОЗЕРО HURON | Морской гроза ветер | 79.3650793650794 | 50 |
ЗАЛИВ МЕКСИКИ | Морской гроза ветер | 71.7504332755633 | 414 |
ГАВАЙИ | Шторм | 70.0218818380744 | 320 |
В следующем примере создается набор случайных чисел и вычисляется:
- Сколько разных значений в наборе (
Dcount
) - Первые три значения в наборе
- Сумма всех этих значений в наборе
Эту операцию можно выполнить с помощью пакетов и материализации:
let randomSet =
materialize(
range x from 1 to 3000000 step 1
| project value = rand(10000000));
randomSet | summarize Dcount=dcount(value);
randomSet | top 3 by value;
randomSet | summarize Sum=sum(value)
Результирующий набор 1:
Dcount |
---|
2578351 |
Результирующий набор 2:
значение |
---|
9999998 |
9999998 |
9999997 |
Результирующий набор 3:
Sum |
---|
15002960543563 |
Примеры использования materialize()
Совет
Материализуйте столбец во время приема, если большинство запросов приводят к извлечению полей из динамических объектов в миллионах строк.
Чтобы использовать инструкцию let
со значением, которое используется несколько раз, используйте функцию materialize(). Попробуйте отправить все возможные операторы, которые будут уменьшать материализованный набор данных и по-прежнему сохранять семантику запроса. Например, используйте фильтры или только обязательные столбцы проекта.
let materializedData = materialize(Table
| where Timestamp > ago(1d));
union (materializedData
| where Text !has "somestring"
| summarize dcount(Resource1)), (materializedData
| where Text !has "somestring"
| summarize dcount(Resource2))
Фильтр является Text
взаимным и может быть отправлен в материализуемое выражение.
Запросу требуются только столбцы Timestamp
, Text
и Resource2
Resource1
. Проецируемые эти столбцы внутри материализованного выражения.
let materializedData = materialize(Table
| where Timestamp > ago(1d)
| where Text !has "somestring"
| project Timestamp, Resource1, Resource2, Text);
union (materializedData
| summarize dcount(Resource1)), (materializedData
| summarize dcount(Resource2))
Если фильтры не идентичны, как показано в следующем запросе:
let materializedData = materialize(Table
| where Timestamp > ago(1d));
union (materializedData
| where Text has "String1"
| summarize dcount(Resource1)), (materializedData
| where Text has "String2"
| summarize dcount(Resource2))
Когда объединенный фильтр значительно сокращает материализованный результат, объединяйте оба фильтра в материализованном результате or
логическим выражением, как показано в следующем запросе. Однако сохраняйте фильтры в каждой части объединения, чтобы сохранить семантику запроса.
let materializedData = materialize(Table
| where Timestamp > ago(1d)
| where Text has "String1" or Text has "String2"
| project Timestamp, Resource1, Resource2, Text);
union (materializedData
| where Text has "String1"
| summarize dcount(Resource1)), (materializedData
| where Text has "String2"
| summarize dcount(Resource2))