You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Data Explorer查询执行时缓存标量函数结果的方法

KQL中缓存多次引用的耗时标量值的方法

materialize()函数仅支持缓存tabular表达式,无法直接用于标量值,所以像materialize(toscalar(print 1))这种写法会触发以下错误:

无法将类型为“Kusto.DataNode.RelationalQuery.ToScalarOperator”的对象强制转换为类型“Kusto.DataNode.RelationalQuery.RelationalOperator”。

针对你提到的「耗时较长且多次引用的标量返回型存储函数」,目前最直接的解决方案是将标量值封装为1×1的表,用materialize()缓存这个表,再通过toscalar()提取标量值重复使用。

示例实现

基础场景(对应你的最小示例)

// 先把标量封装成1×1的表并缓存
let A_table = materialize(print value = 1);
// 提取标量值
let A = toscalar(A_table);
// 后续可多次引用A
union (print A), (print(A))

调用耗时存储函数的场景

假设你的存储函数名为MyExpensiveScalarFunction,接收tabular和标量参数:

// 缓存存储函数的结果为1×1表
let cached_result_table = materialize(
    print result = MyExpensiveScalarFunction(my_input_table, my_scalar_parameter)
);
// 提取缓存后的标量值
let cached_scalar = toscalar(cached_result_table);
// 多次复用该标量值,无需重复执行耗时函数
print first_usage = cached_scalar, second_usage = cached_scalar * 2, third_usage = cached_scalar + 10

说明

目前KQL没有专门的标量缓存函数,这种1×1表的封装方式是官方认可的变通方案,能确保耗时的存储函数仅执行一次,后续所有引用都复用缓存的结果,达到性能优化的目的。

内容的提问来源于stack exchange,提问作者karl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 00:39:55