在模块中使用更多 let 变量会导致 xquery 中出现内存问题吗?

using more let variables in the module shall cause memory issue in xquery?

在我的代码中,

我有以下片段

if($node/@attr) 
 then fn:data($node/@attr) 
 else ""

现在为了提高性能我想把它改成

let $attr := $node/@attr
 return if($attr) 
        then fn:data($attr) 
        else ""

哪一个会好?第一还是第二

在函数或模块中使用更多 let 变量会导致内存问题或性能下降吗?

视情况而定

这在很大程度上取决于您选择的 XQuery 实现:在一个引擎上,let 表达式的成本可能比重新计算表达式的成本更高,在其他引擎上则可能相反。这也很可能取决于返回的数据量。大量将需要更多内存,但评估起来也更昂贵。其他引擎可能使用流方法,无论如何只需要常量内存...

总而言之,您必须尝试对这两个版本进行基准测试,以了解发生了什么。如果您的查询引擎输出查询计划,请研究优化器是否无论如何都不会将您的查询更改为完全不同的查询。最后,您可能会意识到在大多数情况下它不会产生(值得注意的)差异,无论如何:坚持使用更易读和理解的代码版本,并且不太可能涉及编程错误。

查询优化器

如果有一个合理的查询优化器,最好不要做这种小的优化,大多数时候优化器比开发人员更清楚(尤其是,如果输入不时不同)。

优化此特定查询

在你非常特殊的例子中,fn:data($node/@attr) 应该没问题,无论如何对于大多数用例,否则应用 string(...) 或者简单地转换为字符串 fn:string($node/@attr).