我有一个基本查询:
/*[fn:name()="something"]
(1) Marklogic 7 需要几秒钟,我可以添加一个索引来加快这个查询吗?
(2) 应该增加哪些内存限制以提高性能?
(3) 有没有其他方法可以通过不同的查询来提高性能但得到完全相同的结果?
我有一个基本查询:
/*[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,就会有一种更快的方法。
经过一番思考,我决定您的“真实”场景必须涉及动态元素名称,或者您可能正在尝试查看元素名称是否与一系列名称中的一个匹配。
我已经绘制了一个示例,它的输出如下所示,它演示了如何在不使用基于的限定符的情况下仍然使用两者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>
:)
除了其他好的建议,考虑应用分页。MarkLogic 可以快速从索引中识别有趣的内容,但从磁盘中提取实际内容相对较慢。一次发送所有结果可能意味着在通过网络发送回复之前尝试将所有结果(可能是数十亿)保存在内存中。分页允许批量提取结果,这可以保持较低的内存使用率,并且还可能允许并行化。
!