优化使用命名表达式的查询

适用于:✅Azure 数据资源管理器Azure MonitorMicrosoft Sentinel

本文讨论如何优化查询中命名表达式的重复使用。

在 Kusto 查询语言中,可通过多种不同的方式将名称绑定到复杂表达式:

在查询中引用这些命名表达式时,将执行以下步骤:

  1. 计算命名表达式中的计算。 此计算生成标量值或表格值。
  2. 命名表达式替换为计算值。

如果多次使用相同的绑定名称,则基础计算将重复多次。 这在什么情况下是个问题?

  • 当计算消耗许多资源并被多次使用时。
  • 当计算是非确定性的,但查询假定所有调用都返回相同的值时。

缓解操作

要缓解这些问题,可在查询期间将计算结果具体化到内存中。 根据命名计算的定义方式,你将使用不同的具体化策略:

表格函数

对表格函数使用以下策略:

  • let 语句和函数参数:使用 materialize() 函数。
  • as 运算符:将 hint.materialized 提示值设置为 true

例如,以下查询使用非确定性表格示例运算符

注意

表通常不进行排序,因此根据定义,查询中的任何表引用都是非确定性的。

不使用 materialize 函数的行为

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

输出

x
63
92

使用 materialize 函数的行为

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