Caching 需要帮助重写XQuery以避免MarkLogic中的扩展树缓存已满错误吗

Caching 需要帮助重写XQuery以避免MarkLogic中的扩展树缓存已满错误吗,caching,xquery,marklogic,Caching,Xquery,Marklogic,我不熟悉XQuery和MarkLogic。 我正在尝试更新MarkLogic中的文档,并获取扩展树缓存已满错误。 为了完成这项工作,我增加了扩展树缓存,但不推荐这样做。 我想调整这个查询,使它不需要同时缓存那么多XML 这是我的问题 我已经上传了我的查询作为一个图像,因为它不是那么漂亮,当我把它粘贴在编辑器上。如果有人知道更好的方法,请建议 提前感谢。执行一次选择太多XML节点的查询可能会导致扩展树缓存错误。在您的示例中,这可能是罪魁祸首:/tx:AttVal[tx:AttributeName/

我不熟悉XQuery和MarkLogic。 我正在尝试更新MarkLogic中的文档,并获取扩展树缓存已满错误。 为了完成这项工作,我增加了扩展树缓存,但不推荐这样做。 我想调整这个查询,使它不需要同时缓存那么多XML

这是我的问题

我已经上传了我的查询作为一个图像,因为它不是那么漂亮,当我把它粘贴在编辑器上。如果有人知道更好的方法,请建议


提前感谢。

执行一次选择太多XML节点的查询可能会导致扩展树缓存错误。在您的示例中,这可能是罪魁祸首:
/tx:AttVal[tx:AttributeName/text()=$AttributeName]

调用
text()
可能是问题的根源(而且
text()
可能不是您的意思-请参见),这会导致MarkLogic在所有这些节点上计算该函数,并且通过简单地使用
/tx:AttVal[tx:AttributeName=$AttributeName]
它可能会解决您的问题

下一步,我想在<代码> /tx:Atval/Tx:AttAuthNeX<代码>上添加一个路径范围索引,并使用<代码> CTS:Quest< <代码> > <代码> CTS:路径范围查询< /代码>查询这些节点。这将大大快于没有范围索引的XPath。还可以将XPath与范围索引一起使用:MarkLogic将自动优化XPath表达式以使用范围索引;但是,可能存在它没有正确优化表达式的原因,您需要使用

xdmp:plan
检查是否正确


还要注意,MarkLogic中XML的一般最佳实践建议是使用“语义XML”。例如,当您指的是属性时,请使用属性:
。MarkLogic的索引针对语义XML设计进行了开箱即用的优化。但是,如果您没有选择,只能使用XML,那么这就是路径范围索引的设计目的。

我刚刚解决了这个问题。我做了两件事

  • 我将node replace和node insert类型调用(即将XML结构修改为单独模块的任何调用),然后使用
    xdmp:invoke
    调用该模块,传入所需的任何参数,如下所示

    让$update:=xdmp:invoke(“/app/lib/update attribute node.xqy”, (xs:QName(“newValue”),$new), {xdmp:modules-database()})

之所以这样做,是因为对xdmp:invoke的调用发生在它自己的事务中,一旦完成,内存就会被清除。如果不这样做,那么每次调用update或insert函数时,它实际上都不会执行写入操作,直到在单个事务中结束,这意味着您的内存将很快填满

  • 每当我需要在MarkLogic中循环路径(或文档或任何它们被称为的东西-我只使用MarkLogic几天)我想出了一个精心设计的方法,一次跳过并只获取一批文档,但是你可以用多种方法来完成

    让$whater:=xdmp:directory(“/whater/”[$start to$end]

我还将其放入一个单独的模块中,以便立即处理,而不是在单个事务中处理


一次将所有昂贵的调用放入单独的模块中,只占用大数据集的一个子集,帮助我解决扩展树Cache完全错误。

堆栈溢出使用标记。请参阅此文档以了解如何适当地格式化代码:调用方法有效,并且可以考虑使用<代码> XDMP:调用函数< /CO。de>而是简化代码。我建议使用工具成批处理您的工作,而不是手动操作。请看一下Corb和Taskbot,如下所示: