同一数据库内查询的 Marklogic 性能差异

Marklogic performance difference for queries within same database

我有一个 28770 文档数据库,里面装满了 3 种 XML 文档。对于 3 个根元素中的 2 个,count(//rootelementname) 非常快(0.01 秒)。但是,对第三个根元素的计数查询非常慢(17 秒)。我想知道为什么。

有问题的根元素称为 SGDTEKST。如果我输入:

count(//SGDTEKST), xdmp:query-meters()

然后发现主要问题是(我认为):

<qm:expanded-tree-cache-hits>17</qm:expanded-tree-cache-hits>
<qm:expanded-tree-cache-misses>9571</qm:expanded-tree-cache-misses>
<qm:compressed-tree-cache-hits>1</qm:compressed-tree-cache-hits>
<qm:compressed-tree-cache-misses>9570</qm:compressed-tree-cache-misses>
<qm:in-memory-compressed-tree-hits>0</qm:in-memory-compressed-tree-hits>

所以事实证明,大多数 SGDTEKST 根元素节点都没有被索引。将 xdmp:query-meters() 添加到其他根元素的 count() 显示没有缓存未命中(考虑到速度,这并不奇怪)。

为什么有些文档会被跳过?文档的大小并没有真正的不同(SGDTEKST 稍大)。摄取的顺序是交替的,所以它不像最后添加的 SGDTEKST 文档。

任何人都可以解释这种行为吗?我是否需要在某处设置显式索引以防止这种情况发生?

与大多数缓存一样,它的行为基于使用情况。除了 运行 一个脚本可以用你想要的文件来预热它之外,你可以做很多事情来控制它。然而,在某些时候它会开始将它们分页出来——这就是缓存的本质。

如果你要统计的元素都是数据库文档的根,那么直接用xdmp:estimate(//element-name),只用索引统计,速度会快很多。 xdmp:estimate 将 return 匹配表达式的数据库文档的数量 - 如果您知道表达式与文档是一对一的,那么 count()xdmp:estimate() 应该平等。

缓存未命中并不意味着 "not indexed"。 MarkLogic 默认索引所有元素。

相反,这意味着该条目在查询加载之前不在缓存中。缓存很可能比数据库小很多,所以只有least recently used entries are cached。在这种情况下,条目是树:即文档。