首页 > 解决方案 > 扩展树缓存已满错误

问题描述

对于以下代码,我得到扩展的树缓存已满:

xquery version "1.0-ml";
let $result :=
  <root>{
    cts:search(
      fn:collection("metadata-search")/metadata,
      cts:and-query((   
          cts:element-value-query(xs:QName('AssetID'), "*")
      ))
    )/assetIdentifiers/assetIdentifier/AssetID


  }</root>
let $path := "D:\Output\input.xml"
return 
  xdmp:save($path, $result,
            <options xmlns="xdmp:save">
              <method>xml</method>
            </options>
  )

但如果我在迭代模式下运行相同的代码,它工作正常:

xquery version "1.0-ml";
let $result :=
  <root>{
    for $data in cts:search(
      fn:collection("metadata-search")/metadata,
      cts:and-query((   
         cts:element-value-query(xs:QName('AssetID'), "*")
      ))
    )
    return $data/assetIdentifiers/assetIdentifier/AssetID
  }</root>
let $path := "D:\Output\input.xml"
return 
  xdmp:save($path, $result,
            <options xmlns="xdmp:save">
              <method>xml</method>
            </options>
  )

数据库中有 450000 个资产,运行需要 10 分钟,我想知道为什么其他代码构造工作正常而不是第一个?任何想法,请让我详细了解此代码的上下文?

标签: marklogicmarklogic-8

解决方案


第一种方法在整个结果集上应用 XPath 表达式。XPath 强制执行文档排序结果,强制 MarkLogic 对整个结果集进行排序。第二个对每个文档执行此操作,运行速度要快得多。

请注意,它仍然不能很好地扩展。如果确实需要,您可能最好对搜索结果进行批处理,单独保存批处理,并在 MarkLogic 之外聚合到一个总 xml 中。Corb2 之类的工具和DMSDK 之类的库在这里可以派上用场,为您完成繁重的工作。


推荐阅读