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

时间:2015-10-01 10:24:01

标签: xquery

在我的代码中,

我有以下代码段

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

现在为了提高性能,我想将其改为

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

哪一个会好?第一或第二

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

1 个答案:

答案 0 :(得分:2)

取决于

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

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

查询优化器

如果有一个合理的查询优化器,最好不要做这样的小优化,大多数情况下优化器比开发人员更了解(特别是,如果输入不时)。

优化此特定查询

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