我有一个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 )
是否有更高性能的循环数据库方法,数据库末尾的文档与数据库开头的文档一样快速获取?
答案 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。