Xquery优化
我的xquery如下所示:Xquery优化,xquery,marklogic,Xquery,Marklogic,我的xquery如下所示: declare variable $i := doc()/some-element/modifier[empty(modifier-value)]; $i[1]/../..; 我需要在Marklogic的Qconsole上运行这个查询,其中有721170811条记录。由于这是大量的记录,我得到超时错误。是否有任何方法可以优化此查询以获得结果 另外,我无法请求amdin增加超时时间 尝试创建元素范围索引(如果目标元素不唯一,则创建路径范围索引)并使用cts:value
declare variable $i := doc()/some-element/modifier[empty(modifier-value)];
$i[1]/../..;
我需要在Marklogic的Qconsole上运行这个查询,其中有721170811条记录。由于这是大量的记录,我得到超时错误。是否有任何方法可以优化此查询以获得结果
另外,我无法请求amdin增加超时时间 尝试创建元素范围索引(如果目标元素不唯一,则创建路径范围索引)并使用cts:values()词典查找 这样,请求就可以从范围索引中读取值,而不必读取每个文档 见:
尝试创建元素范围索引(如果目标元素不唯一,则创建路径范围索引)并使用cts:values()词典查找 这样,请求就可以从范围索引中读取值,而不必读取每个文档 见:
您可以使用xdmp:spawn,在进行查询时创建一个库,获取文档,迭代结果,每次迭代收集1000个文档,然后调用另一个xdmp:spawn来处理该数据集中的信息,我建议汇总结果,只返回您需要的信息,以免浏览器崩溃,最后应该是这样的:
xdmp:spawn("process.xqy")
declare variable $i := cts:search(fn:collection(),
cts:element-query(xs:QName("some-element"),
cts:element-value-query(xs:QName("modifier"), "", "exact")
)
)[1];
进入库进程。xqy
function local:start-process(){
let $docs := (....)
let $temp := for $x in $docs[$start to $end]
return local:process-dataset($temp) (: Could use spawn here too if you want :)
return xdmp:spawn("collect.xqy",$temp)
}
local:start-process()
compact data功能应使用您的数据创建一个或一组文件,这样服务器将运行所有过程,几分钟后您将可以查看您的数据而不会出现问题。您可以使用xdmp:spawn,在进行查询时创建库,获取文档,迭代结果,每次迭代收集1000个文档,并调用另一个xdmp:spawn来处理来自该数据集的信息,我建议对结果进行汇总,以仅返回不使浏览器崩溃所需的信息,最后应如下所示:
xdmp:spawn("process.xqy")
declare variable $i := cts:search(fn:collection(),
cts:element-query(xs:QName("some-element"),
cts:element-value-query(xs:QName("modifier"), "", "exact")
)
)[1];
进入库进程。xqy
function local:start-process(){
let $docs := (....)
let $temp := for $x in $docs[$start to $end]
return local:process-dataset($temp) (: Could use spawn here too if you want :)
return xdmp:spawn("collect.xqy",$temp)
}
local:start-process()
压缩数据功能应该使用您的数据创建一个文件或一组文件,这样服务器将运行所有过程,几分钟后您将可以查看您的数据,而不会出现问题。您不希望运行类似于
doc()的操作
或xdmp:directory
-只返回一个每次都会杀死你的结果集。你需要把你的成绩降低很多
一些想法:
d-node
中完成尽可能多的工作,在e-node
中完成尽可能少的工作。这是一种超越泛化的方法,但在大多数情况下,我将其视为d-node
stuff是数据、索引、词典工作等。e-node
stuff处理xQuery等。因此,在您的示例中,您肯定在计算e-node
比您需要的要多cts:search
,因为它使用索引而不是xPath来解析查询。比如说:
xdmp:spawn("process.xqy")
declare variable $i := cts:search(fn:collection(),
cts:element-query(xs:QName("some-element"),
cts:element-value-query(xs:QName("modifier"), "", "exact")
)
)[1];
这将返回
文档节点
,它看起来像是您使用$i[1]/../../..
所需要的。这将搜索xPathsome元素
,以查找空的修饰符。您不想运行类似doc()
或xdmp:directory
的内容,只返回一个每次都会杀死您的结果集。你需要把你的成绩降低很多
一些想法:
您希望在MarkLogic的d-node
中完成尽可能多的工作,在e-node
中完成尽可能少的工作。这是一种超越泛化的方法,但在大多数情况下,我将其视为d-node
stuff是数据、索引、词典工作等。e-node
stuff处理xQuery等。因此,在您的示例中,您肯定在计算e-node
比您需要的要多
您需要使用cts:search
,因为它使用索引而不是xPath来解析查询。比如说:
xdmp:spawn("process.xqy")
declare variable $i := cts:search(fn:collection(),
cts:element-query(xs:QName("some-element"),
cts:element-value-query(xs:QName("modifier"), "", "exact")
)
)[1];
这将返回文档节点
,它看起来像是您使用$i[1]/../../..
所需要的。这将搜索xPath某些元素
,以查找空的修饰符。请创建元素范围索引和属性范围索引,并使用cts:search如果熟悉marklogic,编写查询将很容易。请创建元素范围索引和属性范围索引,如果需要,请使用cts:search如果您熟悉marklogic,那么编写查询将很容易。因为我无法请求管理员,有什么方法可以从我的角度优化代码吗?有7亿个文档,如果您需要经常运行查询,您最好的策略是说服管理员添加范围索引。否则,一种替代方法是使用cts:uris()函数,将some元素条件作为cts:query传递,以收集客户端中的文档URI。然后,迭代页面中的URI列表,每次从一页文档中检索值。您可以使用REST API values端点来执行cts:query,并使用REST API documents端点通过转换来提取值。由于我无法请求管理员,是否有任何方法可以从我的端点优化该代码?对于7亿个文档,如果您需要频繁运行查询,最好的策略是说服管理员添加范围索引。否则,一种替代方法是使用cts:uris()函数,将some元素条件作为cts:query传递,以收集客户端中的文档URI。然后,迭代页面中的URI列表,每次从一页文档中检索值。您可以使用restapi值端点执行cts:query,使用restapi文档端点进行转换以提取值。