如何在以下方面提高 Marklogic 7 的性能:/*[fn:name()="something"]

How can I improve Marklogic 7 performance on the following: /*[fn:name()="something"]

我有一个基本查询:

/*[fn:name()="something"]

(1) Marklogic 7 花费了好几秒,我可以添加一个索引来加快查询速度吗?

(2) 应增加哪些内存限制以提高性能?

(3) 是否有其他方法可以提高不同查询的性能但得到完全相同的结果?

请尝试使用 fn:node-name。我相信这是优化的。您需要正确处理命名空间,这就是为什么它可以优化而 fn:name 不能的部分原因。

 /*[fn:node-name()=fn:QName("","something")] 

以下两个 xPath 应该完全相同:

/theNameOfMyElement

/*[fn:name()="theNameOfMyElement"]

后者添加了不必要且昂贵的限定符。首先,* 必须搜索所有内容,而不仅仅是元素。该方法还存在其他几个问题。

如果我的第一个查询仍然需要很长时间,请使用 cts:search,因为它会根据索引进行搜索,因此速度要快得多。上面的查询可以这样写:

cts:search(/theNameOfMyElement, ())

其中第二个参数(空序列)可以是限定的 cts:query

如果命名空间适合您,您可以这样做:

/*:theNameOfMyElement

/*[fn:name()="something"] 对我来说似乎是非常糟糕的做法。请改用 /something

编辑

在看到另一个答案被接受后,我一直在思考如果他的解决方案有效而我的解决方案无效,您必须尝试解决什么情况。我仍然非常确定,只要按照 xPath 的设计工作方式使用它,就会有一种更快的方法。

经过一番思考,我决定您的 "real" 方案必须涉及动态元素名称,或者您可能会尝试查看元素名称是否与一系列名称中的一个相匹配。

我已经绘制了一个示例,下面提供了它的输出,它演示了如何在不使用基于 fn:node-name

的限定符的情况下仍然可以同时使用两者
let $xml as element(sample) := <sample>
    <wrapper>
      <product>
        <entry>
          <red>.00</red>
          <yellow>.00</yellow>
          <blue>.50</blue>
        </entry>
      </product>
    </wrapper>
  </sample>
let $type as xs:string := "product"
return $xml/wrapper/xdmp:unpath($type)/entry/(red|yellow)

(: Returns 
  <red>.00</red>
  <yellow>.00</yellow> 
:)

除了其他好的建议,考虑应用分页。 MarkLogic 可以快速从索引中识别出有趣的内容,但从磁盘中提取实际内容相对较慢。一次发送所有结果可能意味着在通过网络发送回复之前尝试将所有结果(可能数十亿)保存在内存中。分页允许分批提取结果,从而保持较低的内存使用率,并可能允许并行化。

HTH!