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

Добрый день. Есть таблица на 500тыс записей. Регулярно приходят данные пакетам по

примерно 2тыс записей и ее необходимо обновлять.

Подскажите, какой алгоритм будет быстрее?

1. Удалить 2тыс записей за один delete и потом вставить при помощи одного insert.

Или

2. Сделать 2 тыс update запросов.

Интуитивно кажется что первый вариант будет быстрее, за счёт того что будет только 2 запроса

Возможно есть какой-то более производительный способ для массового обновления данных в таблице?

21 ответов

27 просмотров

Быстрее будет сделано, скорее всего, то, что вам понятнее.

Marat-Fakhertdinov Автор вопроса
Marat Fakhertdinov
Не очень понял) «Понятнее»?

Да. Меньшэ кода, код проще, меньшэ плохо запоминаемых связей в коде. Смотреть на скорость компьютэров при таких маленьких объёмах чаще всего не имеет смысла. В задачах, в которых имеет смысл — их не имеет смысла решать без нормальных инжэнерных измерений. Определение нагрузки, определение, что такое "быстрее/медленнее", определение жэлеза, создание стэнда, набор повторяемых реалистичных измерений, вот это всё. Решать их голосованием в чятиках смысла никакого нет. Да и, в любом случае, скорее всего ваша скорость будет зависеть от каких-то странных особенностей вашэго загрузчика. Так что дажэ гадать — что будет у вас быстрее — смысла никакого нет, дажэ если будет более полная информацыя о таблицах.

Marat-Fakhertdinov Автор вопроса
Ilya Anfimov
Да. Меньшэ кода, код проще, меньшэ плохо запоминае...

Все равно не понимаю мысль. Написать меньше кода или упростить его - такой цели не стоит. Скорость компьютера - тоже речь не про это. Вопрос стоит не как уложить данный процесс в секунду, а как эффективней использовать то что есть. Вопрос в том сколько манипуляций необходимо сделать постгресу чтобы добиться нужного результата. Например, вставить 2000записей при помощи 2000 insert-ов будет гарантированно медленнее чем один insert с 2000 записями. Мы потратимся на отправку большего sql кода, парсинг каждого запроса и тп. В случае с удалением и последующей вставкой, или апдейтами мне сложно оценить какой алгоритм будет проще для постгреса без понимания какие реальные операции нужно будет ему сделать. Я могу сделать простой замер, и собственно так и сделаю, но хочется 1) не только знать что так будет быстрее, но и понимать почему. 2) я могу выбрать более быстрый алгоритм но получить негативное фоновое воздействие, которое может аукнутся. Поэтому интересуюсь здесь

Marat Fakhertdinov
Все равно не понимаю мысль. Написать меньше кода ...

А вы сделайте препарированный запрос и не надо будет парсить.

Стесняюсь спросить, у вас в пакете из 2к записей все существуют в исходном наборе?

а зачем удалять и вставлять? почему не сделать один апдейт на 2к записей? При отсутствии каких-то хитрых условий, - конечно лучше делать пачкой по 2к, чем в цикле посылать 2000 запросов. Причин много: один апдейт на 2к строк будет быстрей, чем 2к апдейтов 1 network раундтрип vs 2к раундтрипов работа с WAL более эффективная при 1 апдейте

Marat Fakhertdinov
Все равно не понимаю мысль. Написать меньше кода ...

А-а. Пан спортсмен. Ну, тренируйтесь тогда, да. Только непонятно — нафига спрашывать совсем детские вопросы, которые в большом спорте по перекладыванию байтов в памяти решаются буквально одним измерением. Да что там одним измерением — любой спортивный забег начинается с написания секундомера, который призван давать ответ на этот вопрос.

Marat Fakhertdinov
Все равно не понимаю мысль. Написать меньше кода ...

>1) не только знать что так будет быстрее, но и понимать почему. Получая странные советы от рандомных людей в чятике — вы в любом случае не приблизитесь к реальному пониманию. (Рассматривая результаты измерений — приблизиться можно. Ещё читая код постгреса. Ещё совмещая эти две активности. Задавая абстрактные вопросы инжэнерам — нет, так только философия изучается, а не инжэнерия).

Marat Fakhertdinov
Все равно не понимаю мысль. Написать меньше кода ...

>2) я могу выбрать более быстрый алгоритм но получить негативное фоновое воздействие, которое может аукнутся. Притом примерно всегда. Потому небывает абстрактного "быстро" (бывает абстрактное "медленно"), но всё хорошо по обстоятельствам и требует комплексных измерений.

Marat-Fakhertdinov Автор вопроса
Alexander Shelemin
а зачем удалять и вставлять? почему не сделать оди...

А как сделать апдейт 2к записей за один запрос? Здесь идет апдейт не одного поля, а сразу всех колонок

Marat Fakhertdinov
А как сделать апдейт 2к записей за один запрос? Зд...

https://www.postgresql.org/docs/16/sql-update.html Не лимитирует количество обновляемых записей за один запрос.

Marat-Fakhertdinov Автор вопроса
Ilya Anfimov
https://www.postgresql.org/docs/16/sql-update.html...

Есть таблица id,name,age 1,Вася,23 2,Петр,27 Как можно в один апдейт поменять значения на: 1,Василий,23 2,Петр,28 Я посмотрел страницу что вы скинули, но не понимаю как это возможно

Marat-Fakhertdinov Автор вопроса
Ilya Anfimov
>2) я могу выбрать более быстрый алгоритм но получ...

>> Не бывает абстрактного быстро. Я же пишу, мне важно не быстро/медленно. Мне важно быстрее/медленнее. Сложность алгоритма именно про это.

Marat Fakhertdinov
Есть таблица id,name,age 1,Вася,23 2,Петр,27 Как...

Например, так: https://sqlize.online/sql/psql15/459a411748ccf9b142f15b2455ab8ff2/

Marat Fakhertdinov
Есть таблица id,name,age 1,Вася,23 2,Петр,27 Как...

Если клиентская библиотека/API/драйвер/как-оно-там-называется для доступа к PostgreSQL в используемом "клиентском" PL не совсем уж безнадёжна, то приемлемых вариантов полно. Вот пара примеров: https://sqlize.online/sql/psql15/3b2cb5e52fa56dfd1501fab26ce8b190/

Marat-Fakhertdinov Автор вопроса

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
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
Карта сайта