3

我有一个包含 50,000,000 个文档的数据库,我想将它写入每个文档的 base-uri 文件。运行整个 50,000,000 运行时间太长(查询超时)。所以,我想我会使用谓词将数据库分成更易于管理的批次。因此,我尝试了以下方法来了解其性能:

for $i in ( 49999000 to 50000000 )
return fn:base-uri( /mainDoc[position()=$i] )

但是,这 1000 个基本 uri 的性能非常缓慢。事实上,查询超时了。我尝试了类似的查询并得到了类似的结果(或缺少结果):

for $i in ( /mainDoc ) [ 49999000 to 50000000 ]
return fn:base-uri( $i ) 

是否有一种更高效的方法来遍历大型数据库,其中数据库末尾的文档与数据库开头的文档一样快?

4

2 回答 2

8

如果您只想要文档 URI,那很容易。确保您已启用文档词典并运行cts:uris()呼叫。

要按照您的方法在文档列表中跳转以对每个文档执行某些操作,您可以执行未过滤的工作以使其快速:

for $item in cts:search(/mainDoc, cts:and-query(()), "unfiltered")[49999000 to 5000000]
return base-uri($item)

cts:and-query(())是传递始终为真查询的快捷方式。

于 2013-07-16T20:40:30.737 回答
3

最有效的使用方式cts:uris如下所示:

subsequence(cts:uris((), 'limit=50000000'), 49999000)

如果你可以传入一个起始值,效率会更高,但这需要你预先知道第 49999000 个值。

cts:uris($start-value, 'limit=1000')

有关该功能的更多信息,请参阅http://docs.marklogic.com/cts:uris

于 2013-07-17T21:48:17.480 回答