169 похожих чатов

Всем привет! Доброго времени суток! Есть задача массового обновления записей. Инпут

может быть примерно таким:

[
{
"id": 1,
"a": 256,
"b": 100,
"c": 900000000,
"d": "hello guys"
},
{
"id": 2,
"a": 257,
"b": 100,
"c": 800000000,
"d": "hello guys again"
},
{
"id": 3,
"a": 258,
"b": 100,
"c": 700000000,
"d": "hello guys once again"
}
]

Т.е. массив из обновляемых объектов: находим по айди, и обновляем другие поля.
Максимальное количество таких элементов: 2000 штук.

Получается, если перебирать каждый из них, можно обновить все сущности за 2000 запросов в БД.
Это самый простой вариант, но не думаю что это лучший.

Искал способы сделать это одним запросом, нашел пару заклинаний на SQL с использованием CASE id WHEN 1 then ... WHEN 2 then ...
Хочу уточнить у вас, стоит ли продолжать мысль в этом направлении? Есть ли другие способы это реализовать?
Или не париться и делать перебором?

В общем рад любому совету по оптимизации этой задачи 🙏

10 ответов

13 просмотров

Такую задачу можно решить с помощью Upsert, которая позволит вам удобно обновить или синхронизировать большой объем данных одним запросом. Метод Upsert делает insert записей, которых нет в базе и update для тех что есть.

Siyovush- Автор вопроса

Не вариант бро, логика создания и обновления разделена

Я бы положил во временную таблицу и сделал бы UPDATE .... FROM tempory_table t WHERE id = t.id

Siyovush- Автор вопроса

Максимум 2000 записей, со всей валидацией на обновление уходит примерно 8000 запросов в бд

Siyovush- Автор вопроса

Что-то типа джобов? Очереди?

Валидатор можно кастомный на весь массив

Даже без очереди пролетит за миллисекунды

Siyovush- Автор вопроса

++ Да, работаю над этим, много запросов уменьшил

В чем цель оптимизации, разогнуть пальцы и показать какой я молодец и все сделал одним запросом, но приэтом потратить на него неделю времени разработчика (за эти деньги можно vps помощнее на год взять). Или если прилетит доробатка через пару месяцев и придется другому разбираться в вашей мегаоптимизации, сколько времени займет добавление новых колонок или доп. проверки. А по итогу оказывается выиграли на рантайме 500-600 милисекунд, а запрос делают один раз сутки. Стоит ли оно того? Оценят ли ваши усилия?

Siyovush- Автор вопроса

... Согласен, спорить не могу, аргументов нет, признаюсь ) Цель в том, что по старой логике сервак не выдерживал и часто отказывал. Вот и хотел улучшить по максимуму. С вашей мыслью вполне согласен, из своего опыта знаю: удобный код очень важен) Спасибо за советы ребят 🙏 Рад что такие парни есть )

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта