我的查询最多可以返回2000个文档。 在这些文档中,我需要六个pcdata项作为字符串值返回。 有可能,因为文件大小从小到大, exp树缓存错误。
我正在查看spawn-function来分解我的结果集。 我将基于已知的“唯一键结构”传递通配符值,并且将知道可能的最大结果数;每个通配符值将返回最多100个文档。 注意:唯一键结构的pcdata上有一个范围索引。
我是否在正确的轨道上? 任务服务器将创建三个任务。 任务服务器将允许多个查询运行,但是什么阻止它们同时运行并吹灭exp树缓存? 即什么,如果有的话,迫使一个线程等待另一个?还是一个等待另一个任务的任务,所以他们都不会一起吹灭exp树缓存?
xquery version "1.0-ml";
let $messages :=
(:each wildcard values will return 100 documents max:)
for $message in ("WILDCARDVAL1","WILDCARDVAL2", "WILDCARDVAL3")
let $_ := xdmp:log("Starting")
return
xdmp:spawn-function(function() {
let $_ := xdmp:sleep(5000)
let $_ := xdmp:log(concat("Searching on wildcard val=", $message))
return concat("100 pcdata items from the matched documents for ", $message) },
<options xmlns="xdmp:eval">
<result>true</result>
<transaction-mode>update-auto-commit</transaction-mode>
</options>)
return $messages
答案 0 :(得分:1)
Admin UI中列出的Task Server配置定义了最大并发线程数。如果生成的任务多于线程,则它们会排队(FIFO我认为,虽然ML9具有修改该行为的任务优先级选项),并且第一个排队任务将获取下一个可用线程。
<result>true</result>
选项将强制生成查询,直到任务返回为止。任务本身是独立运行并且并行运行,并且它们不会等待彼此完成。您可能仍然遇到扩展树缓存的问题,但通过将查询拆分为较小的查询,可能不太可能。
为了更好地理解为什么要烧掉缓存,请查看函数xdmp:query-trace()
和xdmp:query-meters()
。使用Task Server更像是一个强力解决方案,通过使用这些函数中的信息优化查询,您可能会获得更好的结果。
如果您不能使查询比2000文档更具选择性,但您只需要几个字符串值,请考虑在这些值上创建范围索引,并使用cts:values
直接从索引中选择这些值,由查询过滤。该方法可以避免强制数据库将文档加载到缓存中。
答案 1 :(得分:1)
使用MarkLogic的功能可能更有效地使用cts:values
等函数从文档中返回共现,甚至3 +元组值组合。您可以混合使用(cts:uri-reference
](http://docs.marklogic.com/cts:uri-reference)来获取作为元组的一部分返回的文档uri。
它要求所有这些值都有范围索引..
HTH!