@DamskiyUgodnik

Возможна ли групповая вставка с проверкой на уникальность в PostgreSql?

Всем привет!
Задача:
  • Распарсить большое количество csv файлов с данными, и залить всё в PostgreSql.

Дополнительные условия:
  • Парсер на python (csv, psycopg2)
  • Структура таблицы - первичный ключ, текстовое поле, численные поля (порядка 10 штук)
  • Текстовое поле должно быть уникальным
  • Текстовое поле в среднем имеет длину порядка 100 символов
  • По числовым полям будут выборки (нужны индексы)
  • Прогнозируемый объём данным ~ 2,5-3 млрд строк
  • На момент записи данных, чтений из таблицы не будет (т.е. данные будут периодически заливаться пачками а потом по обновлённым данным планируется строить отчёты)

Что пробовал:
  • Сейчас сделал решение в лоб, проверка наличия через SELECT и INSERT (заливается по одной записи) в случае необходимости, т.к. решение однопоточное, то этого вполне хватает с точки зрения логики (на всякий случай есть индекс с ограничением на уникальность).
  • Пробовал делать без селекта с "откатом", по скорости сильно большой разницы не заметил, только появляется "головняк" с настройкой логированием запросов, которые "откатились" (возможно просто у меня не хватает опыта в правильной настройке постгри).

Проблемы:
  • После вставки ~50 млн записей, сильно деградирует производительность

Идеи:
  • Попробовать групповую вставку с контролем уникальности через индекс, но тут не понятно, как это вообще можно сделать? ведь например если мы вставляем 50 срок и из них одна дубль, "откатывается" весь запрос.

Собственно вопрос - как это сделать быстро? Есть подозрение, что задача довольно простая и часто встречающаяся, ну и умные люди уже придумали элегантное решение.
  • Вопрос задан
  • 152 просмотра
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега PostgreSQL
Седой и строгий
Вашу проблему решает upsert.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы