Оптимизация запросов, использующих именованные выражения

Переключайте службы с помощью раскрывающегося списка Версия. Дополнительные сведения о навигации.
Область применения: ✅ Microsoft Fabric ✅ Azure Data Explorer ✅ Azure Monitor ✅ Microsoft Sentinel

В этой статье описывается, как оптимизировать использование именованных выражений в запросе.

В языке запросов Kusto можно привязать имена к сложным выражениям несколькими разными способами:

При ссылке на эти именованные выражения в запросе выполняются следующие действия.

  1. Вычисляется вычисление в именованное выражение. Это вычисление создает скалярное или табличное значение.
  2. Именованное выражение заменяется вычисляемым значением.

Если одно и то же связанное имя используется несколько раз, базовый расчет будет повторяться несколько раз. Когда это проблема?

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

Смягчение последствий

Чтобы устранить эти проблемы, можно материализовать вычисление в памяти во время запроса. В зависимости от способа определения именованного вычисления вы будете использовать различные стратегии материализации:

Табличные функции

Используйте следующие стратегии для табличных функций:

  • операторы и параметры функции: используйте функцию materialize().
  • оператор as: задайте для значения hint.materializedподсказки true значение .

Например, следующий запрос использует недетерминированный табличный оператор:

Замечание

Таблицы не отсортированы в целом, поэтому любая ссылка на таблицу в запросе не определена по определению.

Поведение без использования функции материализации

range x from 1 to 100 step 1
| sample 1
| as T
| union T

Выходные данные

x
63
92

Поведение с помощью функции материализации

range x from 1 to 100 step 1
| sample 1
| as hint.materialized=true T
| union T

Выходные данные

x
95
95

Скалярные функции

Недетерминированные скалярные функции могут быть вынуждены вычислять ровно один раз с помощью toscalar().

Например, следующий запрос использует недетерминированную функцию rand():

let x = () {rand(1000)};
let y = () {toscalar(rand(1000))};
print x, x, y, y

Выходные данные

print_0 print_1 print_2 print_3
166 137 70 70