2

我正在使用以下两个查询(Optic and CTS)来获取 path-range index 的值/tXML/Item/PutawayCategory

查询 1: - 大约花了。4 milliseconds执行并返回 17 个不同的值。我尝试多次执行相同的查询。

xquery version "1.0-ml";
import module namespace op="http://marklogic.com/optic"  at "/MarkLogic/optic.xqy";

op:from-lexicons(map:entry("PutawayCategory", cts:path-reference("/tXML/Item/PutawayCategory")))
=> op:where-distinct()
=> op:result()

查询 2: - 大约花了。0.30 milliseconds得到相同的结果Query 1

xquery version "1.0-ml";

cts:values(cts:path-reference("/tXML/Item/PutawayCategory"))

我不明白为什么Optic Query执行时间比cts查询要多。

请帮助我理解这一点。

4

1 回答 1

3

将您的光学查询更改为使用op:group-by("PutawayCategory")op:where-distinct()它应该会执行得更好。

xquery version "1.0-ml";
import module namespace op="http://marklogic.com/optic"  at "/MarkLogic/optic.xqy";

op:from-lexicons(map:entry("PutawayCategory", cts:path-reference("/tXML/Item/PutawayCategory")))
=> op:group-by("PutawayCategory")
=> op:result()

op:from-lexicon

Optic 基于同一个文档中词典值的共现发出行,类似于cts:value-tuples.

这意味着op:from-lexicons()返回多个文档中存在的值的每个实例,并且可以多次返回,而不是一个不同的列表,然后op:where-distinct()是过滤和重复数据删除,这会消耗 CPU 和时间。值集越大,op:where-distinct()需要做的工作(和时间)就越多。

cts:values()直接从路径范围索引词典中提取不同的值列表,因此要做的工作更少。

MarkLogic 可能有一种方法可以使用op:where-distinct(). 如果您有权访问 MarkLogic 支持,那么如果您创建一个支持案例来查询它会很有帮助。

于 2021-07-02T13:46:49.330 回答