我有一个基本查询:
/*[fn:name()="something"]
(1)Marklogic 7需要多秒,是否有可以添加的索引使这个查询更快?
(2)应该增加哪些内存限制以提高性能?
(3)是否有其他方法可以通过不同的查询来提高性能但得到完全相同的结果?
答案 0 :(得分:5)
请尝试使用fn:node-name
。我相信这是优化的。您需要正确处理命名空间,这也是fn:name
无法优化的原因之一。
/*[fn:node-name()=fn:QName("","something")]
答案 1 :(得分:2)
以下两个xPath应完全相同:
/theNameOfMyElement
和
/*[fn:name()="theNameOfMyElement"]
后者正在添加一个不必要且昂贵的限定符。首先,*
必须搜索所有内容,而不仅仅是元素。该方法存在其他几个问题。
如果我的第一个查询仍然花费很长时间,请使用cts:search
,这在搜索索引时要快得多。上面的查询可以这样写:
cts:search(/theNameOfMyElement, ())
第二个参数(空序列)可以是符合条件的cts:query
。
如果命名空间符合您的要求,您可以这样做:
/*:theNameOfMyElement
/*[fn:name()="something"]
对我来说似乎是非常糟糕的做法。请改用/something
。
修改强>
在看到其他答案被接受之后,我一直试图想一想如果他的解决方案有效并且我的解决方案无法解决你必须尝试解决的问题。我仍然非常肯定只需按照设计工作的方式使用xPath就有更快的方法。
经过一番思考,我已经决定了你的真实"场景必须涉及动态元素名称,或者您可能正在尝试查看元素名称是否与一系列名称匹配。我已经使用下面提供的输出制作了一个示例,演示了如何在不使用基于fn:node-name
let $xml as element(sample) := <sample>
<wrapper>
<product>
<entry>
<red>$1.00</red>
<yellow>$3.00</yellow>
<blue>$4.50</blue>
</entry>
</product>
</wrapper>
</sample>
let $type as xs:string := "product"
return $xml/wrapper/xdmp:unpath($type)/entry/(red|yellow)
(: Returns
<red>$1.00</red>
<yellow>$3.00</yellow>
:)
答案 2 :(得分:1)
除了其他好的建议外,请考虑应用分页。 MarkLogic可以快速识别索引中的有趣内容,但从磁盘中提取实际内容相对较慢。并且立即发送所有结果可能意味着在通过线路发送回复之前尝试将所有结果(可能是数十亿)保存在内存中。分页允许批量提取结果,这可以降低内存使用率,并且可能允许并行化。
HTH!