marklogic上的扩展树缓存已满

问题描述 投票:2回答:4

我正在MarkLogic应用程序的查询控制台上运行以下查询,在此基础上,我将检索与筛选器查询匹配的那些文档的ID。我将在执行时完全面对扩展树缓存。我的查询:

let $a: = cts:search(doc(),
  cts:element-query(xs:QName("doc__doc_type"), cts:and-query(()))
)
for $doc in $a
return ($doc//base__unique_id/text())

如何微调此查询?

与该查询匹配的文档数为1336967。配置的树大小为2048MB。

我需要微调此查询的帮助,以便它返回页面中的值。

xquery marklogic
4个回答
3
投票

您有几个选项可用于优化此查询。

  • 最佳选择:假定base__unique_id实际上是唯一ID,您可以在其上放置范围索引,并使用cts:element-values返回查询中的所有现有值。这将是一个更快的查询,并且将使用更少的内存,因为您不会打开所有返回的文档。
  • 分页您的结果。不要一枪返回所有结果。在几个查询过程中执行此操作。如果您只是生成所有结果的列表,还可以查看cts:element-values以帮助您以可扩展的方式进行此操作。
  • 如果这样做很有意义,您可能需要考虑根据文档类型为数据分配名称空间。这将产生较小的术语列表(提高了性能),并且可以简化许多查询表达式。
  • 如果您不遵循我的第一个建议,则可以尝试使用绝对XPath表达式,而不是现在使用的相对表达式。
  • 如果您没有遵循我的第一个建议,则可以不过滤CORB2。这将有助于加快结果的速度,但可能无法解决扩展的树缓存错误。

1
投票

如果无法轻松创建索引,并希望避免翻录所有文档时炸开扩展的树缓存...

这可能不是最快的(并且可能需要提高超时限制),但是通过消除FLWOR语句并使用不需要执行以下操作的表达式,可以避免XDMP-EXPNTREECACHEFULL错误。缓冲任何文档或值,例如:

cts:search

0
投票

您可以通过以下方式对cts:search(doc(), cts:element-query(xs:QName("doc__doc_type"), cts:and-query(())) )//base__unique_id/text() 返回的序列进行子序列化来从cts:search中分页结果:

cts:search

背景

有关更多详细信息,请参见let $a := cts:search(doc(), cts:element-query(xs:QName("doc__doc_type"),cts:and-query(())) ) let $page1 := $a[1 to 10] let $page2 := $a[11 to 20] return $page1 关于分页和过滤的搜索。

默认情况下,MarkLogicdocumentationAPI通过两个步骤执行搜索:

  1. 直接从索引中识别候选片段(文档)ID。这是在内存中完成的,而且速度很快。结果可能包含误报。

  2. 候选片段ID从磁盘装入,并针对所有搜索条件进行彻底检查以滤除误报。这是在内存中完成的,速度很慢。

[如果您想加快搜索速度并且可以容忍假阳性,则可以通过执行未过滤的搜索来跳过第二步,仅从索引中解析候选片段:

cts:search

0
投票

使用“未过滤”选项。这将使索引解析步骤停止搜索,从而不允许筛选文档。过滤文档意味着一步一步地解压缩文档片段以搜索将使用扩展的树缓存的术语。给定结果数量,最好使用此选项。

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