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
相关产品推荐
相关产品推荐

