优化使用命名表达式的查询
本文讨论如何优化查询中命名表达式的重复使用。
在 Kusto 查询语言中,可通过多种不同的方式将名称绑定到复杂表达式:
在查询中引用这些命名表达式时,将执行以下步骤:
- 计算命名表达式中的计算。 此计算生成标量值或表格值。
- 命名表达式替换为计算值。
如果多次使用相同的绑定名称,则基础计算将重复多次。 这在什么情况下是个问题?
- 当计算消耗许多资源并被多次使用时。
- 当计算是非确定性的,但查询假定所有调用都返回相同的值时。
缓解操作
要缓解这些问题,可在查询期间将计算结果具体化到内存中。 根据命名计算的定义方式,你将使用不同的具体化策略:
表格函数
对表格函数使用以下策略:
- 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 |