MarkLogic Optic API:按订单执行

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

我们有两种类型的文件:书籍和书籍部分。我们使用TDE来定义这两种类型的视图。

架构(相关部分):

  • 查看书籍:id,title
  • 查看booksections:id,bookid

用例是列出超过5000个部分的书籍。对于每本书,应返回标题和部分数量。使用Optic API,group-by查询是这样的:


    op:from-view("myschema", "books") => 
    op:join-inner(op:from-view("myschema", "booksections"), op:on(
        op:view-col("books", "id"),
        op:view-col("booksections",   "bookid"))) => 
    op:group-by(
        (op:view-col("books", "title")), 
        (op:count("count", op:view-col("booksections", "id")))) => 
    op:where(op:ge(op:col("count"), 5000)) => 
    op:select((op:view-col("books", "title"), "count")) => 
    op:order-by(op:desc("count")) => 
    op:result()

查询返回一个小结果集:4本书。现在有趣的是,这个查询需要5秒才能完成,如果我删除op:order-by语句,只需3秒。不知何故花了2秒钟来订购结果中的4本书。

我有什么办法可以加快订购速度(除了作为后处理步骤进行订购)?

用温暖的三重高速缓存测量时间。 op:explain将order-by操作显示为最外部的操作,表示订购适用于小型4本书。使用SQL导致相同的运行时间和相同的加速度没有order-by。

marklogic marklogic-9
2个回答
1
投票

绝对升级到新的MarkLogic版本可能有助于解决问题。尽管如此,花两秒钟来排序4行结果绝对不能令人信服。在添加op:order-by()子句时,在查询执行期间会发生更多事情,这应该可以解释时间的增加。

为了更好地理解在执行两个查询期间实际发生的事情,我们应该看一下服务器返回的查询计划(使用op:explain())。根据添加到查询的基础数据和order-by()子句的统计信息,查询优化器可能会选择不同的查询计划。共享两个查询的查询计划将帮助我们找到正确的方向,以帮助优化程序选择更好的查询计划。


1
投票

您可能最好将MarkLogic支持与测试用例联系起来。我会说Ramesh是对的,并且查询优化器正在为您的查询选择次优查询计划。

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