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

我的xquery如下所示:

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
-只返回一个每次都会杀死你的结果集。你需要把你的成绩降低很多

一些想法:

  • 您希望在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
    some元素
    ,以查找空的
    修饰符。

    您不想运行类似
    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文档端点进行转换以提取值。