我有一个基本的查询:
/*[fn:name()="something"](1) Marklogic 7占用多秒时间,是否有我可以添加的索引来使查询更快?
(2)在记忆限制方面,应增加哪一项以改善工作表现?
(3)是否有其他方法来提高不同查询的性能,但得到完全相同的结果?
发布于 2016-02-25 23:25:40
尝试使用fn:node-name代替。我相信这是优化的。您需要正确处理名称空间,这也是为什么可以优化名称空间而fn:name不能优化名称空间的部分原因。
/*[fn:node-name()=fn:QName("","something")] 发布于 2016-02-26 00:49:14
以下两个xPaths应该完全相同:
/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>
:)发布于 2016-02-26 06:09:29
除了其他好的建议,考虑应用分页。MarkLogic可以快速地从索引中识别出感兴趣的内容,但从磁盘中提取实际内容的速度相对较慢。同时发送所有结果可能意味着在通过线路发送回复之前,尝试将所有结果(可能有数十亿)保存在内存中。分页允许在批处理中提取结果,这使内存使用率保持在较低的水平,并且可能还允许并行化。
哈哈!
https://stackoverflow.com/questions/35640376
复制相似问题