Marklogic:查询响应时间非常长

时间:2013-02-21 09:10:33

标签: marklogic

我在uri中有大约15000个xml格式的记录,比如:“documents/products/specs/*.xml”。 每个xml的大小约为25千字节。我连接到这个marklogic服务器,使用一个具有XCC client(Java)的远程Apache Tomcat服务器,它试图执行类似这样的AdHocQuery

let $a := cts:uri-match('documents/products/specs/*.xml')
          for $xml in $a
          return fn:doc($a)

(for循环在java中实现)。

这很好用。但对于计数较大的记录,比如15000记录,需要60分钟,而所有服务器和互联网速度都非常好。 (uri中所有文档的总大小约为20 MB,不应超过20分钟)。

有没有解决方法?

3 个答案:

答案 0 :(得分:2)

试试这个:

cts:search(
    fn:doc(),
    cts:document-query(
        cts:uri-match('documents/products/specs/*.xml')
    ), "unfiltered"
)

答案 1 :(得分:1)

您正在做的是请求所有文件的全部内容。这不是典型的查询,而是数据库转储。您显示的查询将缓冲所有这些数据,然后通过tomcat发送它,再次缓存所有数据,然后将其发送给您。 这是一个要在一个请求中发送的大型数据集。

您的查询意图是什么?如果要获取所有文档,则应使用mlcp等程序将其转储出来,或者通过先收集URI然后获取文档来小批量获取它们。通过并行执行文档获取可以大大加速这一点。您可以在xmlsh中看到Java源代码示例,其中显示了如何在XCC中并行获取文档

http://xmlsh.svn.sourceforge.net/viewvc/xmlsh/extensions/marklogic/src/org/xmlsh/marklogic/get.java?revision=792&view=markup

我的猜测(如果我错了,请纠正我)是你只是在试验,实际上并不需要所有的文档。在这种情况下,应该尝试更现实的查询。

答案 2 :(得分:0)

查询花费这么长时间的原因是因为Marklogic服务器正在从磁盘读取,对于大多数这些文件。除非你有一个非常大的树缓存大小。您需要做的是降低查询范围。也许为文件添加一些索引。

所有这一切都说如果您想要做的就是ETL数据输出那么您可能想要批处理请求。