Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Переключайте службы с помощью раскрывающегося списка Версия. Дополнительные сведения о навигации.
Область применения: ✅ Microsoft Fabric ✅ Azure Data Explorer ✅ Azure Monitor ✅ Microsoft Sentinel
Записывает значение табличного выражения в течение длительности выполнения запроса, чтобы его можно было ссылаться несколько раз запросом без пересчета.
Синтаксис
materialize(
выражение)
Дополнительные сведения о соглашениях синтаксиса.
Параметры
| Имя (название) | Тип | Обязательно | Описание |
|---|---|---|---|
| выражение | string |
✔️ | Табличное выражение, вычисляемое и кэшированное во время выполнения запроса. |
Замечания
Эта materialize() функция полезна в следующих сценариях:
- Чтобы ускорить запросы, выполняющие тяжелые вычисления, результаты которых используются несколько раз в запросе.
- Чтобы оценить табличное выражение только один раз и использовать его много раз в запросе. Это обычно требуется, если табличное выражение недетерминировано. Например, если выражение использует
rand()функции илиdcount()функции.
Примечание.
Materialize имеет ограничение размера кэша в 5 ГБ. Это ограничение равно узлу кластера и является взаимным для всех запросов, выполняющихся одновременно. Если запрос использует materialize() и кэш не может содержать больше данных, запрос будет прерваться с ошибкой.
Совет
- Другим способом выполнения материализации табличного выражения является использование
hint.materializedфлага оператора как оператора и оператора секционирования. Все они совместно используют один кэш материализации. - Отправьте все возможные операторы, которые сокращают материализованный набор данных и сохраняют семантику запроса. Например, используйте общие фильтры на вершине одного материализованного выражения.
- Используйте материализацию с присоединением или объединением, если их операнды имеют взаимные вложенные запросы, которые можно выполнить один раз. Например, соединение или объединение ног. См . пример использования оператора соединения.
- Материализация может использоваться только в инструкциях let, если вы даете кэшированному результату имя. Пример использования инструкций let).
Caution
Тестируйте запросы с помощью и без материализации(), чтобы узнать, улучшается ли производительность для ваших данных и шаблонов запросов. В некоторых случаях материализация() может увеличить использование памяти без значительного повышения производительности, поэтому тестирование помогает выбрать оптимальный подход.
Примеры улучшения производительности запросов
В следующем примере показано, как 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
Выходные данные
| Штат | Тип события | EventPercentage | События |
|---|---|---|---|
| ГАВАЙСКИЕ ВОДЫ | Смерч | 100 | 2 |
| ОЗЕРО ОНТАРИО | Морской гроза ветер | 100 | 8 |
| ЗАЛИВ АЛЯСКИ | Смерч | 100 | 4 |
| АТЛАНТИЧЕСКИЙ СЕВЕР | Морской гроза ветер | 95.2127659574468 | 179 |
| LAKE ERIE | Морской гроза ветер | 92.5925925925926 | двадцать пять |
| E PACIFIC | Смерч | девяносто | 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:
| Сумма |
|---|
| 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и Resource1Resource2. Проецируемые эти столбцы внутри материализованного выражения.
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))