Поделиться через


materialize()

Область применения: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft 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и Resource2Resource1. Проецируемые эти столбцы внутри материализованного выражения.

    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))