Hallo liebes Forum,
ich portiere gerade eine Anwendung von sqlite3 zu Postgresql. Grund: Netzwerkfähigkeit und Zugriff von vielen Klienten auf dieselben Daten.
Es gibt Datenbanken mit 10Mio+ Einträgen welche ich importieren muss. Das dauert leider mit einer Verbindung relativ lange. In meinem Testfall 30 Minuten für 5 Mio Einträge. Jetzt hab ich 48 Threads gemacht welche parallel die Daten importieren. Ein Sqlite3 “Producer” und 48 Verbindungen um sie zu importieren. Die Importer schreiben “nicht normalisiert” in eine Import Tabelle und dann wird zyklisch das “normalisiert” und in die Zieltabellen geschrieben.
Gibt es eine einfachere aber trotzdem effektive Methode das zu importieren? Kann man den “Durchsatz” einer Verbindung noch erhöhen?
Momentan mit den 48 Threads schaut das so aus:
Meine Umgebung:
- Debian Linux (Bookworm)
- Postgresql 15.7 (PostgreSQL 15.7-git on x86_64-pc-linux-gnu, compiled by gcc (GCC) 14.1.0, 64-bit)
- libpqxx 7.9.1 (git Version)
- gcc-14.1 (git Version)
Transaction Isolation Level musste ich auf
using Transaction_t = pqxx::transaction<pqxx::isolation_level::serializable>;
setzen da die Prozedur zum verschieben der importierten Daten ein Delete ohne Bedingung auf der Import Tabelle macht und dabei noch nicht verschobene Daten gelöscht worden sind. Der direkte Import hat deutlich länger gebraucht da er häufiger JOINs gebraucht hat als der jetztige Ansatz.
Für Ideen wäre ich dankbar!
Viele Grüße
Georg