在大型数据库上使用谓词?

时间:2013-07-16 20:01:00

标签: marklogic

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

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

但是,这1000个基础uris的表现非常缓慢。实际上,查询超时了。我尝试了类似的查询并获得了类似的结果(或缺乏结果):

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

是否有更高性能的循环数据库方法,数据库末尾的文档与数据库开头的文档一样快速获取?

2 个答案:

答案 0 :(得分:7)

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

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

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

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

答案 1 :(得分:2)

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

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

如果您传入一个起始值会更有效,但这需要您预先知道49999000th值。

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

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