Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在模块中使用更多的let变量会导致xquery内存问题吗?_Xquery - Fatal编程技术网

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

在模块中使用更多的let变量会导致xquery内存问题吗?,xquery,Xquery,在我的代码中 我有以下代码片段 if($node/@attr) then fn:data($node/@attr) else "" 现在,为了提高性能,我想将其更改为 let $attr := $node/@attr return if($attr) then fn:data($attr) else "" 哪一个好?第一或第二 在函数或模块中使用更多的let变量将导致内存问题或性能下降?这取决于 这在很大程度上取决于您选择的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)
,非常感谢。同样,在一个模块中有多个全局变量是好主意吗?如果你只有几个,你可能永远不会关心它。如果您正在生成包含数百或数千个变量的代码,请开始考虑后果;否则您就不必在意,尤其是如果您正在使用检索到的数据。在与XQuery引擎工作方式相匹配的合理XPath表达式上投入更多精力(例如,某些轴和类型的谓词将比其他轴和类型的谓词昂贵得多),这通常会带来显著的性能改进。把一个变量放在这里或那里通常根本无法测量。