扩展树缓存已满错误

时间:2018-06-26 12:05:50

标签: marklogic marklogic-8

对于以下代码,我将得到完整的扩展树缓存:

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>
  )

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

1 个答案:

答案 0 :(得分:4)

第一种方法将XPath表达式应用于整个结果集。 XPath强制执行文档排序的结果,从而迫使MarkLogic对整个结果集进行排序。第二个命令针对每个文档执行此操作,运行速度更快。

请注意,它仍然无法很好地扩展。如果确实需要,最好对批处理搜索结果进行批处理,单独保存批处理,并汇总到MarkLogic之外的总xml中。 Corb2之类的工具和DMSDK之类的库在这里可以大量使用,为您带来繁重的工作。

HTH!