Оригинал на GitHub
Вопрос
Есть простая таблица. В ней номенклатура. Уже около 18 000 строк (так много, чтобы стандартные позиции пользователи не искали и не заносили сразу), то есть, многие просто с кол-вом 0 на складе. Много вычисляемых полей. Не могу пересчитать больше 500 строк, упираюсь в ограничение памяти. Как можно выйти из ситуации?
Ответ
Можно пересчитать вручную, по 500 строк, но это сложновато (а иногда бывают таблицы по 100 млн строк и их уж точно руками не пересчитаешь).
Для таких задач делается разовый Cron.
Нам потребуется поле, в которое мы будем записывать максимальный id, до которого пересчитали. Я сделаю его прям в таблице Кронов — h_store_num
(вы можете поставить его в любое другое место)
В таблице crons создаем задание крона:
a1=: reCalculate(table: 'your_table'; where: 'id' = $list)
~list: selectList(table: 'your_table'; field: 'id'; where: 'id' > #h_store_num; limit: 100; order: 'id' asc)
a2=: set(table: $#ntn; field: 'h_store_num' = $last_num)
last_num: $cut[0]
cut: listCut(list: $list; cut: "first"; num: -1)
a3=: if(condition: $list = $#lc; then: $set_off)
set_off: set(table: $#ntn; field: 'status' = false; where: 'id' = #id)
Из важного:
Сколько строк пересчитывать задается в limit
функции selectList
selectList
обязательно должен иметь order
Строка с selectList обязательно должна быть зафиксирована ~
Поставьте интервал Крона так, чтобы они точно не пересекались с предыдущим (минимальный интервал у крона 1 минута, но может вам стоит сделать 5) или поставить галочку Контроль наложения.
В a3=: прописано отключение крона, когда он дошел до конца таблицы