你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
使用 “版本 ”下拉列表切换服务。 了解有关导航的详细信息。
适用于: ✅ Microsoft Fabric ✅ Azure 数据资源管理器 ✅ Azure Monitor ✅ Microsoft Sentinel
本文讨论如何在查询中优化命名表达式的重复使用。
在 Kusto 查询语言中,可以通过多种不同的方式将名称绑定到复杂表达式:
在查询中引用这些命名表达式时,将执行以下步骤:
- 计算命名表达式中的计算。 此计算生成标量或表格值。
- 命名表达式将替换为计算值。
如果多次使用同一绑定名称,则基础计算将多次重复。 这何时是个问题?
- 当计算消耗许多资源并多次使用时。
- 当计算是不确定的,但查询假定所有调用都返回相同的值。
缓解措施
若要缓解这些问题,可以在查询期间将计算结果具体化到内存中。 根据定义命名计算的方式,你将使用不同的具体化策略:
表格函数
对表格函数使用以下策略:
- let 语句和函数参数:使用 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 |