-
-
Notifications
You must be signed in to change notification settings - Fork 162
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Добавить поддержку выгрузки большого количества данных без подсчёта элементов (-1) #248
Comments
Референсы коллег Общие тезисы
В качестве механик ускорения можно использовать параллельную отправку запросов где возможно и троттлинг в случае ошибок со стороны сервера. strategy.1 — ID filter, no batch, no count, orderдефолтная стратегия из документации https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php Особенности: Задел по оптимизации Запросы отправляются к серверу последовательно с параметром "order": {"ID": "ASC"} (сортировка по возрастанию ID), и в каждом последующем запросе используются результаты предыдущего (фильтрация по ID, где ID > максимального ID в результатах предыдущего запроса). При этом для ускорения используется параметр start = -1 для отключения затратной по времени операции расчета общего количества записей (поле total), которое по умолчанию возвращается в каждом ответе сервера при вызове методов вида *.list. В потенциале для ускорения можно попытаться параллельно передвигаться по списку сущностей в два потока: с начала списка и с конца, продолжая получать страницы, пока ID в двух потоках не пересекутся. Такой способ, возможно, будет давать двукратное ускорение до тех пор, пока не будет исчерпан пул запросов к серверу и не потребуется включить throttling. strategy.2 — .list + .getОсобенности: Задел по оптимизации Составная стратегия, при которой при помощи стратегии "Start increment" от сервера получается сначала список всех ID по методу *.list (с указанием, что нужны только ID - 'select': ['ID']) , а потом через метод *.get получается содержимое всех полей для каждого ID. При этом в обоих шагах используются описанные выше способы ускорения "Объединение запросов в батчи" и "Параллельная отправка батчей". strategy.3 — ID filter, batch, no count, order— ✅ отключён подсчёт количества элементов в выборке Задел по оптимизации Запросы отправляются к серверу последовательно с параметром "order": {"ID": "ASC"} (сортировка по возрастанию ID). Порядок формирования фильтра:
strategy.4 — ID filter, MacroSubstitution, batch, no count, orderВариация strategy.3 c улучшением от Vlad Bazhanov
|
Общий подход к реализации в рамках SDK
|
Доп. тайминги в заголовках
|
Документация
https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php
Часто встает задача импорта каких либо сущностей с портала посредством rest. При этом при большом количестве сущностей прямой подход к задаче, с установкой фильтра и передачей в каждый следующий запрос start = start+50, не оптимальный. Так как, при использование start >= 0 на каждый запрос выполняется еще и запрос подсчета количества элементов удовлетворяющих фильтру. Что при большом количестве элементов, попадающих в него, или при сложной фильтрации работает медленно.
Поэтому в случае если вам не нужно количество элементов ( например вам нужно просто 10 последних записей ) или вы делаете импорт всех записей по фильтру, передавайте start = -1.
Данный параметр отключит выполнение запроса подсчета количества элементов и сильно ускорит выборку.
Для выполнения импорта, при этом необходимо будет отсортировать записи по ID и добавить в фильтр условие ID > значения последнего элемента. И с каждым шагом увеличивать его значение. Значение же последнего элемента брать из последнего значения полученного результата.
Условием остановки импорта будет пустой ответ, или то, что в ответе элементов меньше 50.
Функциональные требования
Подготовка окружения
Стратегии чтения
Опционально
The text was updated successfully, but these errors were encountered: