У нас есть два типа документов: книги и разделы книг. Мы используем 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 привело к тому же времени выполнения и тому же ускорению без упорядочивания.