Всем привет!
Задача:
- Распарсить большое количество csv файлов с данными, и залить всё в PostgreSql.
Дополнительные условия:
- Парсер на python (csv, psycopg2)
- Структура таблицы - первичный ключ, текстовое поле, численные поля (порядка 10 штук)
- Текстовое поле должно быть уникальным
- Текстовое поле в среднем имеет длину порядка 100 символов
- По числовым полям будут выборки (нужны индексы)
- Прогнозируемый объём данным ~ 2,5-3 млрд строк
- На момент записи данных, чтений из таблицы не будет (т.е. данные будут периодически заливаться пачками а потом по обновлённым данным планируется строить отчёты)
Что пробовал:
- Сейчас сделал решение в лоб, проверка наличия через SELECT и INSERT (заливается по одной записи) в случае необходимости, т.к. решение однопоточное, то этого вполне хватает с точки зрения логики (на всякий случай есть индекс с ограничением на уникальность).
- Пробовал делать без селекта с "откатом", по скорости сильно большой разницы не заметил, только появляется "головняк" с настройкой логированием запросов, которые "откатились" (возможно просто у меня не хватает опыта в правильной настройке постгри).
Проблемы:
- После вставки ~50 млн записей, сильно деградирует производительность
Идеи:
- Попробовать групповую вставку с контролем уникальности через индекс, но тут не понятно, как это вообще можно сделать? ведь например если мы вставляем 50 срок и из них одна дубль, "откатывается" весь запрос.
Собственно вопрос - как это сделать быстро? Есть подозрение, что задача довольно простая и часто встречающаяся, ну и умные люди уже придумали элегантное решение.