需要帮助重写XQuery以避免MarkLogic中扩展的树缓存完全错误

Iam*_*maC 2 caching xquery marklogic

我是XQuery和MarkLogic的新手.我正在尝试更新MarkLogic中的文档并获取扩展树缓存完整错误.为了完成工作,我增加了扩展树缓存,但不建议这样做.我想调整此查询,以便它不需要同时缓存尽可能多的XML.

这是我的查询在此输入图像描述

我已将我的查询上传为图像,因为当我将其粘贴到编辑器上时它并不那么漂亮.如果有人知道更好的方法请建议.

提前致谢.

wst*_*wst 5

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

调用可能text()是您问题的根源(text()可能不是您的意思 - 请参阅此博客),导致MarkLogic在所有这些节点上评估该功能,并且通过简单地使用/tx:AttVal[tx:AttributeName=$attributeName]它可以解决您的问题.

接下来我会考虑添加路径范围索引/tx:AttVal/tx:AttributeName并使用cts:search和查询这些节点cts:path-range-query.这将比没有范围索引的XPath快得多.也可以将XPath与范围索引一起使用:MarkLogic将自动优化XPath表达式以使用范围索引; 但是,可能有理由不正确地优化表达式,并且您希望检查使用xdmp:plan.

另请注意,MarkLogic中XML的一般最佳实践建议是使用"语义XML".例如,当您表示属性时,请使用以下属性:<some-node AttributeName=AttVal>.MarkLogic的索引针对语义XML设计进行了优化.但是,如果您没有选项但不使用XML,那么这就是为其设计的路径范围索引.