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

Marklogic 在大型数据库上使用谓词?,marklogic,Marklogic,我有一个50000000文档数据库,我想将它写入一个文件,每个文档的基本uri都是这样的。运行整个50000000太长时间(查询超时)。所以,我想我应该使用谓词将数据库分解成更易于管理的批。因此,我尝试了以下方法来了解其性能: for $i in ( 49999000 to 50000000 ) return fn:base-uri( /mainDoc[position()=$i] ) 但是,这1000个基本URI的性能非常慢。事实上,查询超时了。我尝试了一个类似的查询,得到了类似的结果(或没

我有一个50000000文档数据库,我想将它写入一个文件,每个文档的基本uri都是这样的。运行整个50000000太长时间(查询超时)。所以,我想我应该使用谓词将数据库分解成更易于管理的批。因此,我尝试了以下方法来了解其性能:

for $i in ( 49999000 to 50000000 )
return fn:base-uri( /mainDoc[position()=$i] )
但是,这1000个基本URI的性能非常慢。事实上,查询超时了。我尝试了一个类似的查询,得到了类似的结果(或没有结果):


是否有一种更高效的方法可以在大型数据库中循环,其中数据库末尾的文档与数据库开头的文档获取速度相同?

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

要按照您的方法在文档列表中跳转以处理每个文档,您可以执行未筛选的工作以加快处理速度:

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

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

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

subsequence(cts:uris((), 'limit=50000000'), 49999000)
如果您可以传入一个起始值,则效率会更高,但这需要您预先知道第4999900个值

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

有关该函数的更多信息,请参阅。

您可以使用URI词典吗?访问
cts:uri
将大大提高性能。我尝试了cts:uri((/mainDoc)[49999000到50000000]),但没有获得更好的成功。这就是你的意思吗?不,这不是使用cts:uri的正确方法,谢谢!我尝试了第二种方法,它比我原来问题中的查询速度快得多。谢谢。您的后续解决方案是迄今为止性能最好的。
cts:uris($start-value, 'limit=1000')