Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verwendung von libpqxx zum Massenspeichern von Daten ODER Verwendung der COPY-Anweisung in libpqxx

Das pushLog Die Funktion schreibt jede Einfügung separat fest, und das Festschreiben ist langsam.

Wie in der Dokumentation Befüllen einer Datenbank erläutert :

Auch:

In Ihrem Fall wäre dies jedoch eher ein Problem als ein Vorteil, da jedes INSERT bei einer Verletzung des Primärschlüssels fehlschlagen kann, wodurch die vorherigen INSERTs seit dem letzten Commit abgebrochen werden. Beachten Sie, dass dies auch ein Problem mit COPY , sollten Sie das verwenden.

Da es aus Leistungsgründen wirklich notwendig ist, Abfragen in Transaktionen zu gruppieren, müssen Sie mit Verletzungen des Primärschlüssels so umgehen, dass die Transaktion nicht abgebrochen wird.

Typischerweise werden zwei Methoden verwendet:

  1. Vermeiden Sie den Fehler:INSERT INTO... WHERE NOT EXISTS (SELECT 1 FROM table WHERE primary_key=...)

  2. Fangen Sie den Fehler ab, indem Sie ihn in eine plpgsql-Funktion einfügen, die einen EXCEPTION-Block hat, der itr ignoriert. Die spezifischen INSERT(s), die ein Duplikat verursachen, werden abgebrochen, aber die Transaktion wird nicht abgebrochen.

Wenn Sie gleichzeitige Einfügungen haben, müssen diese Methoden mit einer Sperrstrategie verfeinert werden.