2017-07-28 48 views
0

我有一个查询可能会返回最多2000个文档。 在这些文档中,我需要六个pcdata项作为字符串值返回。 由于文档大小范围从小到很大,因此存在可能性, exp树缓存错误。ML上的任务服务器

我正在寻找产卵功能来分解我的结果集。 我会根据已知的“唯一键结构”传递通配符值,并知道可能的最大结果数量;每个通配符值将返回最多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 

回答

1

Admin UI中列出的任务服务器配置定义了最大并发线程数。如果产生的任务多于线程,则它们排队(FIFO我认为,尽管ML9具有修改该行为的任务优先级选项),并且第一个排队的任务将占用下一个可用线程。

<result>true</result>选项将强制产卵查询阻塞,直到任务返回。这些任务本身是独立运行的,并且不会彼此等待完成。您可能仍然遇到扩展树缓存的问题,但通过将查询分解为更小的问题,可能不太可能。

为了更好地理解你为什么要吹出缓存,请看看函数xdmp:query-trace()xdmp:query-meters()。使用任务服务器更多的是一种强力解决方案,通过使用这些函数的信息优化您的查询,您可能会获得更好的结果。

如果您不能使查询比2000文档更具选择性,但只需要几个字符串值,请考虑在这些值上创建范围索引并使用cts:values直接从索引中选择那些值,查询。该方法可以避免强制数据库将文档加载到缓存中。

+0

随着通配符值被传递,没有任何*个人*任务可以在超过100个文档上工作 不幸的是,在这一点上不能真正改变数据结构,想到了所需值的范围索引 – paulj

+0

我明白他们没有彼此等待,但是如果资源不可用,它们不会“运行”,即8个任务都使用exp树缓存运行,所以它们“阻塞”。 ly资源是迫使他们排队​​的最大线程。 – paulj

+1

@paulj是的,但是通过拆分作业,您可能会阻止缓存一次完成整理,在这种情况下,您的查询可能会更少的任务线程。任何读取文档的内容都将从展开的树缓存中读取,而不会在线程级别上阻塞。范围指标可能是你最好的选择。 – wst

1

使用MarkLogic的能力从文档中使用像cts:values这样的函数来返回同现或甚至3+元值组合的值可能更有效。您可以在一个混合(cts:uri-referencehttp://docs.marklogic.com/cts:uri-reference)来获取文档的URI返回的元组的一部分。

它需要有上虽然所有这些值范围指标..

HTH!