таблицу. Структура таблицы довольно простая: id, name, field1, field2. Если запись с таким ID уже есть - обновляем.
Как решил пойти я
Создал функцию table_update(id, name, field1, field2) в которой делаю insert и если сработало исключение UNIQUE_VIOLATION, то обновляю запись по переданному в функцию ID.
Собственно вопрос:
Норм ли такой подход?
Чуть позже я решил в функции сначала проверять наличие такого ID в таблице (SELECT COUNT), и на основании проверки уже делать либо добавление, либо обновление записи. Удивительно то, что последний вариант оказался быстрее.
ничего удивительно. обработка ошибок это дорого. попробуйте еще не по одной строке обработку сделать
Upsert не подходит? Или в пг нет?
Я проверял на массиве данных в 100к записей. В среднем обработка при отлове исключения прошла за 55 секунд, при использовании SELECT COUNT ушло 49 секунд
тут надо знать, чего больше update или инсерт
Не пробовал
Весьма медленно, кстати. Логично было бы в пределах 10с на сервере начального уровня. Много индэксов? Нагружэнный сервер?
уверены что бутылочное горлышко будет именно вставка? откуда данные берете для вставки?
Данные - выгрузка в формате XML из чужой БД, которая периодически обновляется. Брать только обновленные записи, к сожалению, не вариант.
можно было бы хранимку написать как вариант, но вообще время загрузки в 60 секунд выглядить весьма маленьким, чтобы пытаться что то оптимизировать
А в чем плюс оборачивания апсерта в хранимку?
обработка данных прямо в БД скорее всего ускорит вставку до минимального времени
для таких операций есть merge. Вроде в postgresql его уже добавили
в 15 версии которая даже в релиз еще не вышла
Обсуждают сегодня