【问题标题】:At what point are variables loaded?在什么时候加载变量?
【发布时间】:2019-06-25 15:02:44
【问题描述】:

我们正在重构一个非常大的系统,并查看了我们编写的许多 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 是填充在 import 上还是仅当我在查询中实际使用它时才填充?就像我编写一个从未引用 $g:doc.langmap 但导入该模块的 xQuery 一样,它是否仍然在内存中创建并填充?

我想知道_global.xq 中是否还有许多其他声明变量可用于许多其他xQueries。当然,我不使用每个参考文献中的一些参考资料。那么问题就很简单了……import module 命令是否会导致它们在导入时都被评估,还是它们只有在使用时才具有值?

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

【问题讨论】:

    标签: xquery exist-db


    【解决方案1】:

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

    当运行大约需要 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 实际上并没有填充数据,除非使用它来回答我的问题。如果我错了,请插话。

    【讨论】:

    • 答案可能更微妙,您需要 eXist 专家来获得明确的答案。例如,如果存在对全局引用的静态引用但包含静态引用的代码没有执行(例如,它出现在未调用的函数中),则答案可能不一样。它还可能取决于配置设置(例如,对于 Saxon,它取决于优化级别)。
    • 谢谢@MichaelKay。我们正在做一些额外的测试,到目前为止还没有看到任何“奇怪”的效果。尽管我会说,在上面的测试查询中,我故意选择了未在范围索引中编制索引的内容,以使查询运行时间更长。如果我们在变量中构建的内容也被索引,我们实际上不确定是否发生了任何事情,因为查询是 0.1 到 0.2 秒。
    猜你喜欢
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 2011-11-25
    相关资源
    最近更新 更多