1

Оптимизация запросов виалон

(edited by Константин Зорков 14/10/2020 16:43:15)

Topic: Оптимизация запросов виалон

Описание текущего алгоритма:
На данный момент в системе реализован следующий алгоритм получения данных из “Виалон”:
1) “Логин под токеном” (token/login), запрос выполняется разово для получения ID сессии.
2) “Поиск элементов” (core/search_items), запрос выполняется для каждого необходимого транспортного средства. Транспортных средств может быть сколько угодно. В параметрах указывается тип искомых элементов: “avl_unit”, имя свойства: “sys_name”, так же указывается значение свойства, а именно номер ТС. Из результата отбирается “id” для выполнения дальнейших запросов. Пример запроса в файле “Приложение 1”.
3) “Выполнение отчета” (report/exec_report), запрос выполняется для каждого полученного на предыдущем этапе “id” транспортного средства. В параметрах укзывается id ресурса (reportResourceId), id шаблона (reportTemplateId), id элемента (reportObjectId), id подэлемента указывается 0, задается временной интервал (может быть равен одному часу). Из результата отбирается массив таблиц. Пример запроса в файле “Приложение 2”.
4) “Получить строки таблицы” (report/get_result_rows), запрос выполняется для каждой полученной на предыдущем этапе таблицы. В параметрах указывается индекс таблицы, индекс первой и последней полученной строки. Из результата отбираются необходимые данные по транспортным средствам. Пример запроса в файле “Приложение 3”.

Пункты 2, 3, 4 выполняются для некоторого списка тс, который может быть более 500 штук.


Предложенный механизм оптимизации алгоритма
После первого обращения Нам было предложено использовать операцию “Выполнение нескольких команд” (core/batch). Исходя из информации из технической документации о том, что “Выполнение отчета” (report/exec_report) невозможно выполнять несколько раз в одной сессии, то Нами предположено, что следующий алгоритм невозможен:
1) “Поиск элементов” (core/search_items) для всех транспортных средств в одном запросе.
2) “Выполнение отчета” (report/exec_report) для всех найденных на предыдущем шаге id в одном запросе.
3) “Получить строки таблицы” (report/get_result_rows) для всех отчетов.
Появился вариант объединить эти три запроса в один запрос с использованием операции “Выполнение нескольких команд” (core/batch) следующим образом:
1) “Поиск элементов” (core/search_items) для одного транспортных средств.
2) “Выполнение отчета” (report/exec_report) для найденного на предыдущем шаге id.
3) “Получить строки таблицы” (report/get_result_rows) для текущего отчета.
4) “Удаление результата предыдущего отчета” (report/cleanup_result) для текущего отчета.
5) Повторять пункты 1-4 для всех транспортных средств.
Но при таком алгоритме запроса возникает вопросы:
“А будет ли данный алгоритм более оптимизированный и снизится ли время выполнения?”
“Если же данный алгоритм более эффективный и менее время затратный, то намного ли, так как транспортных средств может быть более 500 штук и интервал времени при выполнении отчета может быть час?”
Так же еще интересующие Нас вопросы:
“Какие еще варианты оптимизации алгоритма могут быть Вами предложены?”
По скольким транспортным средствам получится выполнять данный запрос, чтобы он не переполнялся?

Post's attachments

Attachment icon Приложение 1.txt 246 b, 8 downloads since 2020-10-14 

Attachment icon Приложение 2.txt 272 b, 6 downloads since 2020-10-14 

Attachment icon Приложение 3.txt 142 b, 4 downloads since 2020-10-14 

2

Оптимизация запросов виалон

Re: Оптимизация запросов виалон

Добрый день!

Использование core/batch запроса в вашем случае не сильно оптимизирует. Т.к при работе с отчетами - в любом случае нужно дождаться выполнения отчета на сервере : можно ожидать в фоне так скажем и парралельно еще какие-то дейсвтия выполнять ( параметр remoteExec =1  ) , можно просто ждать результата (без выполнения каких-либо паралельный действий)

Единственный метод оптимизации для большего кол-ва объектов  в таком случае - это выполнять групповые отчеты : группы можно создать заранее с N кол-вом объектов, либо формировать по мере необходимости (в этом случае один из id объектов указывается в параметре reportObjectId, остальные в массиве в reportObjectIdList )

Время и эффективность зависит от кол-ва анализируемых данных (кол-во сообщений объектов) , сложности отчета. Например, отчет с 10ю таблицами может  дольше выполняться , чем например 2-3 таблицы. Плюс еще, конечно, еще интервал отчета, кол-во объектов в группе, все более-менее точно проверить только на практике

Diana Cheley
Wialon Hosting Expert
Gurtam
3

Оптимизация запросов виалон

(edited by Лео 23/10/2020 10:56:04)

Re: Оптимизация запросов виалон

А помните, @chdi мой вопрос на ту же тему?
Есть в программировании такой страшный косяк - запрос в цикле. Это когда один и тот же запрос выполняется 500 раз вместо того, чтобы один раз выполнить, передав в него список из 500 элементов.
Так вот ваша апишка позволяет нам работать с виалоном только по подобию запроса в цикле. Это крайне затратно по ресурсам вам и долго и неудобно нам.
Почему бы не зафиксировать фича-реквест на тему "сделать методы апи для работы с группой объектов"? Мы один раз заливаем список ТС, выполняем по нему какой-либо запрос и сами разбираем табличку результатов. Всё делается одним запросом. Это быстро и удобно всем.

ps: у о***ком это есть и работает удобно