|
Порционное выполнение запроса Homer, Max57, Кирпич, ads55, Dmitrii, shuhard, Мультук, Dani, StanLee, unenu, Шаграм, Logovazz, Климов Сергей, Ager, ddubrovin, DemonShinji2, nick86, АгентБезопаснойНацио, zenik, maxar, Галахад, JohnGilbert, RomanYS, Eiffil123, КонецЕсли, uno-group, Rawasert, trk415e76, DmitryKSL, mTema32, obs191, drearyd, trooba, Prog_man, saaken, KJlag, elka302, Lama12, Олдж, lucky-nn, arsik, orakool, integer, dergreche, глазковыколупыватель, AlexKimp, serpentt, LoreLeii, toypaul, TTimur, Silgis, U4Me2, diamkms, Наивный, Сукпун, Ageres, Скучный бух, Бертыш, Garykom
| ☑ | ||
|---|---|---|---|---|
|
0
Max57
05.06.26
✎
17:13
|
Всем привет.
Есть свой РН Обороты. По нему собираются данные в JSON. Если период в запросе превышает месяц, запрос падает. Я хочу реализовать запрос в цикле, предварительно разбив период на месяцы. Какие еще могут быть варианты оптимизации? Добавить автономер и выполнять с указание первые n не получится же, так как придется сначала выполнить за год, например, запрос, поместить в вт, а потом к ней делать в цикле запрос? Порядок записей от сотен тысяч до десятков миллионов. |
|||
|
1
Bigbro
05.06.26
✎
17:16
|
а точно запрос падает? может падает вывод/формирование джейсона все же.
запрос имхо должен быть один а дальше результат уже нарезать в зависимости от ограничений. |
|||
|
2
Max57
05.06.26
✎
17:17
|
(1) JSON тоже режется, собирается в файлы через поток.
|
|||
|
3
lubitelxml
05.06.26
✎
17:20
|
(0) покажи запрос. Что значит падает?
|
|||
|
4
Lama12
05.06.26
✎
17:46
|
(0)Полей которые дают уникальную запись много? Можно выбрать первые N делать. Результат помещать во временную таблицу. Потом делать тот-же запрос, но без того что есть во временной таблице. И так до конца.
|
|||
|
5
Dmitrii
гуру
05.06.26
✎
18:36
|
(0) >> запрос в цикле, предварительно разбив период на месяцы
ИМХО, нормальный вариант. Вряд ли другие методы дадут хоть сколько-нибудь заметно более качественный результат. В (4) по сути это самое и предлагает - запрос в цикле. |
|||
|
6
Dmitrii
гуру
05.06.26
✎
18:37
|
(0) >> запрос падает
Как и с какой ошибкой? Просто интересно... |
|||
|
7
shuhard
05.06.26
✎
18:41
|
(6) +1
[запрос падает] напрашивается на детализацию |
|||
|
8
Garykom
гуру
05.06.26
✎
21:05
|
(0) Использовать параллельное выполнение на куче фоновых
Например весь период разбить на дни, запускать запрос в отдельном фоновом для каждого дня Результат фоновых собирать в массив из ТЗ или сразу структур Затем как все фоновые выполнятся - соединить в JSON |
|||
|
9
breezee
05.06.26
✎
22:18
|
А зачем такая аналитика на регистре - если нельзя получить даже месяц оборотов?
|
|||
|
10
timurhv
06.06.26
✎
04:15
|
(0) Бля, как может запрос по РН Оборотам падать? Сиди ковыряй свои левые внутренние соединения и обращения через точку. Ну я блин не знаю, там что каждая позиция чека отражена в какой-нибудь х5 или Магните по всей РФ?
|
|||
|
11
timurhv
06.06.26
✎
04:21
|
Ну вот было типо остатки марок выгрузить в SAP (в Excel бля), а там 50+млн марок, надо выгрузить артикулы номенклатуры, код организации\склада, вот там да, запрос падал и Excel падал и сиди объясняй что ОЗУ на SQL в 2Гб недостаточно и Excel тоже говно.
Я к тому что явно в (0) не 4Гб ОЗУ выделено, чет не то все-таки. 10млн записей за месяц - это что? |
|||
|
12
timurhv
06.06.26
✎
04:24
|
(9) Это скорее всего, ошибка проектирования. Кому она нужна - никому, РН тут нафик не нужен
|
|||
|
13
Max57
06.06.26
✎
21:24
|
Всем спасибо за советы. Это легаси выгрузка в JSON для шины, попробую еще его поковырять, там из регистратора что-то берется, попробую «ВЫРАЗИТЬ» сделать. Вчера запустил 12 млн с чем-то записей, за 3,5 часа корректно отработала с делением по месяцам.
|
|||
|
14
timurhv
06.06.26
✎
22:43
|
(13) Если разово, то ОК. Если на постоянку, то лучше попробовать что-то из этого
https://infostart.ru/1c/articles/2133335/ Т.е. не передавать все данные для записи, а дописывать. Думаю, можно докрутить до 10-30 минут выгрузку |
|||
|
15
Max57
07.06.26
✎
16:02
|
(14) Скорректировал запрос, время выполнения запроса уменьшилось в 4 раза, время выгрузки на час уменьшилось. Там из полей составных типов брались коды и наименования. Я как в этой статье делаю, но не дописываю а создаю по 50к строк файлики. Но за год падает все равно из консоли с ошибкой "превышен максимальный расход памяти сервера за один вызов", оставил разбивку на месяцы.
|
|||
|
16
Кирпич
07.06.26
✎
17:23
|
(15) Ты бы лучше запрос показал. А то так и будешь сам с собой разговаривать.
|
|||
|
17
Кирпич
07.06.26
✎
18:17
|
+(16) Я фиг знает что там автор выгружает, но насоветовать конечно же могу. Может есть смысл одним запросом выгружать отдельно цифры со ссылками на справочники и отдельным запросом справочники? Потом соединять цифры и данные из справочников в процессе вывода JSON(если на каждую запись пишутся имена полей, то это дебилизм).
|
|||
|
18
Garykom
гуру
07.06.26
✎
20:36
|
(17) Ага
Есть подозрение что там дико кривые запросы с кучей неявных соединений Банально запросы тормозят и падают по памяти |
|||
|
19
Кирпич
07.06.26
✎
21:25
|
(18) Да понятно, что дело в запросе. Записать JSON это плёвое дело. 1с пишет текстовый файл в 5-7 гигов за пару минут. И не надо там чудить чего то с дроблениями и параллельными заданиями.
|
|||
|
20
timurhv
07.06.26
✎
22:23
|
(15) Если консоль типовая УФ с ИТС, она будет падать. Там табличный документ, который жрет слишком много ОЗУ. Именно при выгрузке скорее всего такого не будет. Т.е. создается таб.док на сервере условно на 30Гб в ОЗУ и потом это говнище тянет на клиент, но на сервере ОЗУ не освобождает.
|
|||
|
21
Max57
08.06.26
✎
09:11
|
(19) Запросы за месяц нормально отрабатывают миллион-полтора записей минута +/-, львиная доля времени - это выгрузка в JSON.
|
|||
|
22
Мультук
гуру
08.06.26
✎
09:31
|
P.S.
Интересно, до показа кода выгрузки в JSON дело дойдёт ? И в какой серии. |
|||
|
23
Max57
08.06.26
✎
09:50
|
(22) Хотел для спин-офф оставить.
ПодробностиФункция СтруктураВФайлJSON(Структура, СтавимNull = Ложь) Экспорт ВременныйФайлJSON = ПолучитьИмяВременногоФайла("json"); ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(, Символы.Таб); Поток = Новый ФайловыйПоток( ВременныйФайлJSON, РежимОткрытияФайла.Создать, ДоступКФайлу.Запись); ЗаписьJSON = Новый ЗаписьJSON; ЗаписьJSON.ПроверятьСтруктуру = Ложь; ЗаписьJSON.ОткрытьПоток(Поток, КодировкаТекста.UTF8, , ПараметрыЗаписиJSON); ЗаписьJSON.ЗаписатьНачалоОбъекта(); Для Каждого Элемент Из Структура Цикл Если Элемент.Ключ <> "records" Тогда ЗаписьJSON.ЗаписатьИмяСвойства(Элемент.Ключ); ЗаписьJSON.ЗаписатьЗначение(СтрЗаменить(Строка(Элемент.Значение), Символы.НПП, "")); КонецЕсли; КонецЦикла; Если Структура.recordcount > 0 Тогда ЗаписьJSON.ЗаписатьИмяСвойства("records"); ЗаписьJSON.ЗаписатьНачалоМассива(); Для Каждого СтрокаЗаписи Из Структура.records Цикл СтруктураДанных = Новый Структура; Для Каждого Колонка Из Структура.records.Колонки Цикл ИмяПоля = Колонка.Имя; ЗначениеПоля = СтрокаЗаписи[ИмяПоля]; Если ЗначениеЗаполнено(ЗначениеПоля) Тогда СтруктураДанных.Вставить(ИмяПоля, XMLСтрока(ЗначениеПоля)); ИначеЕсли СтавимNull Тогда СтруктураДанных.Вставить(ИмяПоля, Неопределено); Иначе СтруктураДанных.Вставить(ИмяПоля, ""); КонецЕсли; КонецЦикла; ЗаписатьJSON(ЗаписьJSON, СтруктураДанных); КонецЦикла; Структура.records.Очистить(); ЗаписьJSON.ЗаписатьКонецМассива(); КонецЕсли; ЗаписьJSON.ЗаписатьКонецОбъекта(); ЗаписьJSON.Закрыть(); Поток.Закрыть(); Возврат ВременныйФайлJSON; КонецФункции |
|||
|
24
Кирпич
08.06.26
✎
10:00
|
(21) Ну значит выгрузка в JSON написана хреново. А вабще зачем в JSON? Писал бы в csv хотя бы. Так то должно вроде в нормальное время укладываться, если не чудить сильно. Типа такого:
Запись = Новый ЗаписьТекста("1.json"); Запись.Записать("["); Выб = РезультатЗапроса.Выбрать(); Пока Выб.Следующий() Цикл Запись.Записать(СтрШаблон("{""Наименование"":""%1"",""%2"",%3},",СтрЗаменить(Выб.Наименование,"""","\"""),Выб.Номер,Выб.Сумма)); КонецЦикла; Запись.Записать("]"); Запись.Закрыть(); А если прям супербыстро нужно, то можно ЗначениеВФайл и этот файл жахнуть в JSON с помощью любого компилируемого языка |
|||
|
25
Кирпич
08.06.26
✎
10:00
|
+(24) это пример выгрузки в JSON, если что
|
|||
|
26
Кирпич
08.06.26
✎
10:06
|
(23) накой так много всего? пиши проще. вот так можно еще:
Запись = Новый ЗаписьТекста("1.json"); Запись.Записать("["); Выб = РезультатЗапроса.Выбрать(); Пока Выб.Следующий() Цикл П = Новый Структура("Номер,Дата,ШК",Выб.Номер,Строка(Выб.Дата),Выб.Сумма); Запись.Записать(ЗаписатьЗначениеJSON(П)); Запись.Записать(","); КонецЦикла; Запись.Записать("]"); Запись.Закрыть(); |
|||
|
27
shuhard
08.06.26
✎
10:24
|
(15)[с ошибкой "превышен максимальный расход памяти сервера за один вызов"]
если платформа Корп и памяти достаточно - настройками парируется |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |