Xquery 在什么时候加载变量?

Xquery 在什么时候加载变量?,xquery,exist-db,Xquery,Exist Db,我们正在重构一个非常大的系统,查看我们编写的许多xQuery,并想知道使用并包含声明许多全局变量的xQuery是否会有所帮助 但问题是建筑师们。。。这些是参考加载还是仅在使用时加载 意思是说我有一些xQuery_global.xq如下所示: module namespace g="global/variables"; declare variable $g:col.build := '/db/foo/data/Build'; declare variable $g:doc.langmap :=

我们正在重构一个非常大的系统,查看我们编写的许多xQuery,并想知道使用并包含声明许多全局变量的xQuery是否会有所帮助

但问题是建筑师们。。。这些是参考加载还是仅在使用时加载

意思是说我有一些xQuery_global.xq如下所示:

module namespace g="global/variables";
declare variable $g:col.build := '/db/foo/data/Build';
declare variable $g:doc.langmap := doc(concat($g:col.build,'/','langmap.xml'));
declare variable $g:doc.easymap := doc(concat($g:col.build,'/','easymap.xml'));
declare variable $g:doc.foomap := doc(concat($g:col.build,'/','foomap.xml'));
然后我在我的xQuery中引用它:

import module namespace g='global/variables' at '_global.xq';
然后我在xQuery中只使用
$g:doc.langmap
。其他两个(
$g:doc.easymap
$g:doc.foomap
)是否也被计算并加载到内存中,即使我不使用它们

$g:doc.langmap
是在导入时填充的还是仅当我在查询中实际使用它时填充的?比如,如果我编写的xQuery从未引用过
$g:doc.langmap
,而是导入该模块,那么它是否仍然在内存中创建并填充

我想知道,如果我在
\u global.xq
中有几十个其他的declare变量,可以在许多其他的XQuery中使用。当然,我不使用,但在每一篇文章中只使用了一些参考文献。问题很简单。。。
import module
命令是否会导致在导入时对它们进行求值,或者它们仅在使用时才有值


我想这将是一个非常简短的答案。

好的,我相信通过一些简单的测试,我已经知道了答案

当运行大约需要87秒时,我创建了一个Xquery

xquery version "3.0";
declare variable $test := collection('/db/foo/data')//*[@docnum='GS01'];
let $foo := 'bar'
return
$test
如果我将其更改为:

xquery version "3.0";
declare variable $test := collection('/db/foo/data')//*[@docnum='GS01'];
let $foo := 'bar'
return
$foo

它只运行了几分之一秒。这使我相信$test实际上并没有填充数据,除非使用它来回答我的问题。如果我错了,请插话。

答案可能更微妙,你需要一位专家来给出明确的答案。例如,如果存在对全局引用的静态引用,但未执行包含该静态引用的代码(例如,它出现在未调用的函数中),则答案可能不同。这还可能取决于配置设置(例如,对于Saxon,它将取决于优化级别).谢谢你@MichaelKay。我们正在做一些额外的测试,到目前为止还没有看到任何“奇怪”的效果。尽管我想说的是,在上面的测试查询中,我特意选择了一些在范围索引中没有索引的内容,以使查询运行得更长。如果我们在变量中构建的内容也被索引,那么我们实际上不确定是否发生了任何事情,因为查询时间为0.1到0.2秒。