MarkLogic 中针对大型数据集查询的 XQuery 优化

问题描述 投票:0回答:1

我目前正在开发一个涉及在 MarkLogic 数据库中查询大型数据集的项目,我注意到我的一些 XQuery 脚本的运行速度比预期慢,尤其是随着数据集的增长。我正在寻找有关如何优化这些查询以提高性能的建议。

这是我正在使用的查询示例,它检索具有特定元素值的所有文档,但当数据集很大时,它似乎特别慢。该数据库包含多种文档,我感兴趣的是有效查询具有值为“active”的 元素的文档。

xquery version "1.0-ml";

declare namespace p = "http://example.com/project";

for $doc in /p:project[p:status = "active"]
return $doc

这个查询很简单,但是随着文档数量的增长,性能会显着下降。我怀疑查询文档的方式可以改进,也许可以通过更好地利用 MarkLogic 的索引功能或重构查询本身来改进。

具体来说,我正在寻找以下问题的答案:

  1. 是否有更有效的方法来构建此 XQuery 以加速基于元素值的文档检索?
  2. 是否有任何可以调整的 MarkLogic 设置或配置来优化大型数据集的查询性能?
marklogic marklogic-10
1个回答
0
投票

随着数据库的增长,您可能会发现需要考虑使用

cts:*
(核心文本搜索) 函数或 Optic API

例如,您的表达式可以写为

cts:search()
(您也可以使用 for 循环来迭代序列,但如果只是返回
$doc
那么 for 循环就没有意义):

xquery version "1.0-ml";
declare namespace p = "http://example.com/project";
cts:search(doc(), 
  cts:and-query((
    cts:document-root-query(xs:QName("p:project"),
    cts:element-value-query(xs:QName("p:status"), "active", "exact")
  )) 
)

cts:element-value-query()
将命中术语列表,如果这些项目缓存在列表树缓存中,后续调用会更快。

如果您在 p:status 元素上有

range-index
,然后可以使用范围查询,那么速度会更快:

xquery version "1.0-ml";
declare namespace p = "http://example.com/project";
cts:search(doc(), 
  cts:and-query((
    cts:document-root-query(xs:QName("p:project"),
    cts:element-range-query(xs:QName("p:status"), "=", "active")
  )) 
)

但是,如果您要返回大量文档,那么您可能会发现更多文档最终会花费更多时间(检索所有文档并将其流式传输回来),并且添加更多索引无助于实现这一点更快一点。

如果您重新运行相同的查询,您可能会发现如果文档缓存在压缩树缓存和扩展树缓存中,第二次会更快,但如果您尝试从不断增长的集合中返回所有文档 - 您更有可能遇到扩展树缓存错误。

相反,您可以考虑分页并仅返回文档的子集,或者仅返回文档中的信息而不是整个文档(从索引返回会更快)。

评估查询性能时,您可以在查询控制台中执行并使用 Profile Tab,使用

xdmp:plan()
检查查询计划中的
cts:search
表达式,并使用
xdmp:query-meters()
来了解评估您的查询涉及哪些类型的资源。

© www.soinside.com 2019 - 2024. All rights reserved.