【问题标题】:xdmp:spawn-function() Alternativexdmp:spawn-function() 替代方案
【发布时间】:2021-02-17 17:27:43
【问题描述】:

我们在数据库中有大约“2000 万”个文档,我们创建了“10000”个徽章并使用 xdmp:spawn-function() 查询这 2000 万个文档并根据某些条件执行删除操作。但是通过查询控制台运行它,查询正在超时..我们可以寻找任何替代选项,以便查询不会超时

xquery version "1.0-ml";


declare variable $versionToMaintain := 10;
declare variable $batchSize := 10000;

declare function local:delete($values) {

    for $value in $values
        let $versionToDelete :=  $value[3] - $versionToMaintain
    return 
        if ($versionToDelete > 0) then 
            let $query := cts:and-query((
                cts:collection-query('collection name 2'),
                cts:element-range-query(xs:QName('version'), '<=', xs:int($versionToDelete)),
                cts:element-value-query(xs:QName('id'),$value[2]),
        cts:element-range-query(xs:QName('c:created-on'), '<=', xs:dateTime(xdmp:parseDateTime('[Y0001]-[M01]-[D01]')
            ))
            return (cts:uris((), (), $query) ! xdmp:document-delete(.))
        else ()

};

let $totalDocs := 
    xdmp:estimate(
        cts:search(
            collection("collection name 1"),
            cts:not-query(cts:element-value-query(xs:QName('version'), "1")),
            "unfiltered"
        )
    )

let $totalBatches := fn:ceiling($totalDocs div $batchSize)

for $x in (1 to $totalBatches)
    let $values := 
        cts:value-tuples(
            (
                cts:uri-reference(), 
                cts:element-reference(xs:QName('id')), 
                cts:element-reference(xs:QName('version'))
            ),
            ("skip=" || ($x - 1) * $batchSize, "truncate=" || $batchSize),
            cts:and-query((
                cts:collection-query("collection name 1"),
                cts:not-query(cts:element-value-query(xs:QName('version'), "1"))
            ))
        )
    return 
    
            xdmp:spawn-function(function(){
            local:delete($values)
        })

【问题讨论】:

  • 你能发布你正在运行的代码吗?另外,您是否考虑过作为 CoRB 工作运行?
  • 不,我没有将它作为 CoRB 作业运行。
  • 听起来您正在获取 2000 万个文档,而不是 2000 万个 uri,但显示代码将有助于验证问题所在。
  • 我已附上代码..请检查。

标签: xquery marklogic marklogic-9 marklogic-10


【解决方案1】:

好吧,我认为它需要这么长时间并且可能超时的原因是您在 for 循环中对批次进行了很多 cts:value-tuples() 的迭代,而不是将这些工作推到生成的函数中每个批次都被调用。

将分页的cts:value-tuples() 调用移动到local:delete() 内,并传入$x 批处理值,而不是元组。

xquery version "1.0-ml";

declare variable $versionToMaintain := 10;
declare variable $batchSize := 10000;

declare function local:delete($x) {
  let $values := 
        cts:value-tuples(
            (
                cts:uri-reference(), 
                cts:element-reference(xs:QName('id')), 
                cts:element-reference(xs:QName('version'))
            ),
            ("skip=" || ($x - 1) * $batchSize, "truncate=" || $batchSize),
            cts:and-query((
                cts:collection-query("collection name 1"),
                cts:not-query(cts:element-value-query(xs:QName('version'), "1"))
            ))
        )

  for $value in $values
  let $versionToDelete :=  $value[3] - $versionToMaintain
  return 
    if ($versionToDelete > 0) then 
      let $query := cts:and-query((
          cts:collection-query('collection name 2'),
          cts:element-range-query(xs:QName('version'), '<=', xs:int($versionToDelete)),
          cts:element-value-query(xs:QName('id'),$value[2]),
          cts:element-range-query(xs:QName('c:created-on'), '<=', xs:dateTime(xdmp:parseDateTime('[Y0001]-[M01]-[D01]')))
      return (cts:uris((), (), $query) ! xdmp:document-delete(.))
    else ()
};

let $totalDocs := 
    xdmp:estimate(
        cts:search(
            collection("collection name 1"),
            cts:not-query(cts:element-value-query(xs:QName('version'), "1")),
            "unfiltered"
        )
    )
let $totalBatches := fn:ceiling($totalDocs div $batchSize)
for $x in (1 to $totalBatches)
return 
  xdmp:spawn-function(function(){
      local:delete($x)
  })

【讨论】:

    【解决方案2】:

    从 MarkLogic 数据库中删除批量内容(使用存储桶分配)始终是一项挑战。就像 Mads 建议的那样,您应该考虑使用 CoRB。使用不同的选项可以更轻松地调整性能。

    其次,您可以考虑使用分层存储方法 - 例如范围分区或查询分区(只要满足许可要求),您可以将符合所需条件的文档归档到一组林中。然后您可以使用forest-clear() 为您完成这项工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-05
      • 2010-09-10
      • 2012-12-05
      • 2013-11-22
      • 2020-11-23
      • 2013-08-07
      • 2015-09-11
      相关资源
      最近更新 更多