我有一个28770文档数据库,里面有3种XML文档。对于3个rootelements中的2个,count(// rootelementname)非常快(0.01sec)。但是,对第三个根元素的计数查询非常慢(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()添加到其他rootelements的count()显示没有缓存未命中(考虑到速度,这并不奇怪)。
为什么有些文件会被跳过?文件的大小并没有真正的差异(SGDTEKST略大)。摄取的顺序是交替,所以它不像最后添加的SGDTEKST文档。
任何人都可以解释这种行为吗?我是否需要在某处设置显式索引以防止这种情况发生?
答案 0 :(得分:3)
缓存未命中并不意味着&#34;未编入索引&#34;。 MarkLogic默认为所有元素编制索引。
相反,它意味着在查询加载它之前,条目不在缓存中。缓存可能比数据库小得多,因此只有least recently used entries are cached。在这种情况下,条目是树:即文档。
答案 1 :(得分:2)
与大多数缓存一样,它的行为基于用法。除了运行一个用你想要的文件来加热它的脚本之外,你无法控制它。但是,在某些时候它会开始将它们分页 - 这只是缓存的本质。
如果要计算的元素都是数据库文档的根,那么您只需使用xdmp:estimate(//element-name)
,它只使用索引进行计数,并且速度会快得多。 xdmp:estimate
将返回与表达式匹配的数据库文档的数量 - 如果您知道表达式与文档是一对一的,那么count()
和xdmp:estimate()
应该相等。< / p>