MarkLogic Optic API: упорядочение по производительности - PullRequest
1 голос
/ 11 марта 2019

У нас есть два типа документов: книги и разделы книг. Мы используем TDE для определения представлений для двух типов.

Схема (соответствующая часть):

  • просмотр книг: id, title
  • просмотр разделов: id, bookid

Вариант использования - перечислить книги с более чем 5000 разделами. Для каждой книги должны быть указаны название и количество разделов. При использовании Optic API запрос с группировкой выглядит так:


    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: объяснение показывает операцию упорядочения как крайнюю внешнюю операцию, указывая, что упорядочение применяется к небольшому набору из 4 книг. Использование SQL привело к тому же времени выполнения и тому же ускорению без упорядочивания.

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Возможно, вам лучше обратиться в службу поддержки MarkLogic с вашим тестовым примером. Я бы сказал, что Рамеш прав, и что оптимизатор запросов выбирает неоптимальный план запроса для вашего запроса.

1 голос
/ 11 марта 2019

Определенное обновление до новой версии MarkLogic может помочь решить проблему.Несмотря на это, потратить две секунды на сортировку 4 строк результата определенно не убедительно.Когда вы добавляете предложение op: order-by (), гораздо больше происходит во время выполнения запроса, и это должно объяснить увеличение времени.

Чтобы лучше понять, что на самом деле происходит во время выполнения двух запросов,мы должны взглянуть на планы запросов (используя op: объяснение ()), возвращаемые сервером.На основе статистики по базовым данным и предложению order-by (), добавленному в запрос, оптимизатор запросов может выбрать другой план запроса.Совместное использование планов запросов для этих двух запросов поможет нам выбрать правильное направление, чтобы оптимизатор мог выбрать лучший план запросов.

...