繁体   English   中英

MarkLogic Optic API:按订单执行

[英]MarkLogic Optic API: order-by performance

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

架构(相关部分):

  • 查看书籍:ID,标题
  • 查看书目: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可以实现相同的运行时间和相同的加速,而无需按顺序进行。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM