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

Всем привет. Вопрос к знатокам. Задача Добавление записей (порядка 100 миллионов) в

таблицу. Структура таблицы довольно простая: id, name, field1, field2. Если запись с таким ID уже есть - обновляем.

Как решил пойти я
Создал функцию table_update(id, name, field1, field2) в которой делаю insert и если сработало исключение UNIQUE_VIOLATION, то обновляю запись по переданному в функцию ID.

Собственно вопрос:
Норм ли такой подход?
Чуть позже я решил в функции сначала проверять наличие такого ID в таблице (SELECT COUNT), и на основании проверки уже делать либо добавление, либо обновление записи. Удивительно то, что последний вариант оказался быстрее.

13 ответов

11 просмотров

ничего удивительно. обработка ошибок это дорого. попробуйте еще не по одной строке обработку сделать

Upsert не подходит? Или в пг нет?

Shestakov-Artem Автор вопроса
Alexey Bulgakov
ничего удивительно. обработка ошибок это дорого. п...

Я проверял на массиве данных в 100к записей. В среднем обработка при отлове исключения прошла за 55 секунд, при использовании SELECT COUNT ушло 49 секунд

Shestakov Artem
Я проверял на массиве данных в 100к записей. В сре...

тут надо знать, чего больше update или инсерт

Shestakov Artem
Я проверял на массиве данных в 100к записей. В сре...

Весьма медленно, кстати. Логично было бы в пределах 10с на сервере начального уровня. Много индэксов? Нагружэнный сервер?

уверены что бутылочное горлышко будет именно вставка? откуда данные берете для вставки?

Shestakov-Artem Автор вопроса
central hardware
уверены что бутылочное горлышко будет именно встав...

Данные - выгрузка в формате XML из чужой БД, которая периодически обновляется. Брать только обновленные записи, к сожалению, не вариант.

Shestakov Artem
Данные - выгрузка в формате XML из чужой БД, котор...

можно было бы хранимку написать как вариант, но вообще время загрузки в 60 секунд выглядить весьма маленьким, чтобы пытаться что то оптимизировать

central hardware
можно было бы хранимку написать как вариант, но во...

А в чем плюс оборачивания апсерта в хранимку?

Alexey Erpilev
А в чем плюс оборачивания апсерта в хранимку?

обработка данных прямо в БД скорее всего ускорит вставку до минимального времени

для таких операций есть merge. Вроде в postgresql его уже добавили

Kamoliddin Nabijonov
для таких операций есть merge. Вроде в postgresql ...

в 15 версии которая даже в релиз еще не вышла

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

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

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