【问题标题】:Xquery optimizationXquery 优化
【发布时间】:2016-08-05 15:21:23
【问题描述】:

我有这个 xquery 如下:

declare variable $i := doc()/some-element/modifier[empty(modifier-value)];
$i[1]/../..;

我需要在 Marklogic 的 Qconsole 上运行此查询,我们有 721170811 条记录。由于这是大量的记录,我收到超时错误。有什么方法可以优化此查询以获得结果?

附:我不能要求 amdin 增加超时时间。

【问题讨论】:

    标签: xquery marklogic


    【解决方案1】:

    尝试创建一个元素范围索引(如果目标元素不是唯一的,则创建一个路径范围索引)并使用 cts:values() 词典查找。

    这样,请求可以从范围索引中读取值,而不必读取每个文档。

    见:

    http://docs.marklogic.com/guide/search-dev/lexicon

    【讨论】:

    • 由于我无法请求管理员,有什么办法可以优化我的代码吗?
    • 拥有 7 亿个文档,如果您需要频繁运行查询,最好的策略是说服管理员添加范围索引。否则,一种替代方法是使用 cts:uris() 函数,将一些元素标准作为 cts:query 传递,以在客户端中收集文档 uri。然后,遍历页面中的 uris 列表,一次从一页文档中检索值。您可以使用 REST API 值端点来执行 cts:query 和 REST API 文档端点,并通过转换来提取值。
    【解决方案2】:

    您可以使用 xdmp:spawn,在进行查询时创建一个库,获取文档,迭代结果,每次迭代收集 1000 个文档,然后调用另一个 xdmp:spawn 来处理来自该数据集的信息,我建议总结一下结果只返回您不需要使浏览器崩溃的信息,最后应该如下所示:

    xdmp:spawn("process.xqy")
    

    进入库process.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 函数应该使用您的数据创建一个文件或一组文件,这样服务器将运行所有进程,并且在几分钟后您就可以毫无问题地查看您的数据。

    【讨论】:

      【解决方案3】:

      你不想运行像doc()xdmp:directory 这样的东西——只是返回一个每次都会杀死你的结果集。您需要将结果集降低很多。

      一些想法:

      1. 您希望在 MarkLogic 的 d-node 中完成尽可能多的工作,而在 e-node 中完成的工作尽可能少。这是一种过度概括的方式,但在大多数情况下,我认为d-node 的东西是数据、索引、词典工作等。e-node 的东西处理 xQuery 等。所以,在你的例子中,你肯定比你需要的更多地计算出e-node

      2. 您将要使用cts:search,因为它使用索引而不是 xPath 来解析您的查询。所以,是这样的:

        declare variable $i := cts:search(fn:collection(), 
          cts:element-query(xs:QName("some-element"), 
            cts:element-value-query(xs:QName("modifier"), "", "exact")
          )
        )[1];
        

      这将返回document-node's,它看起来就像你想要的$i[1]/../..。这会在 xPath some-element 中搜索为空的 modifier

      【讨论】:

        【解决方案4】:

        如果您熟悉marklogic,请创建元素范围索引和属性范围索引并使用cts:search,这样您编写查询将很容易。

        【讨论】:

          猜你喜欢
          • 2023-03-18
          • 1970-01-01
          • 2019-09-28
          • 2012-03-04
          • 2014-01-07
          • 2018-08-24
          • 1970-01-01
          • 2021-11-20
          • 1970-01-01
          相关资源
          最近更新 更多