Mysql
 sql >> Database >  >> RDS >> Mysql

Utilizzo di libpqxx per archiviare i dati in blocco OPPURE come utilizzare l'istruzione COPY in libpqxx

Il pushLog la funzione esegue il commit di ogni inserto separatamente e il commit è lento.

Come spiegato nella documentazione Popolazione di un database :

Inoltre:

Nel tuo caso, tuttavia, questo sarebbe un problema piuttosto che un vantaggio, perché ogni INSERT potrebbe fallire in caso di violazione della chiave primaria, annullando così gli INSERT precedenti dall'ultimo commit. Nota che questo sarebbe anche un problema con COPY , dovresti usarlo.

Poiché è davvero necessario raggruppare le query nelle transazioni per le prestazioni, è necessario gestire le violazioni della chiave primaria in modo da non interrompere la transazione.

In genere vengono utilizzati due metodi:

  1. Evita l'errore:INSERT INTO... WHERE NOT EXISTS (SELECT 1 FROM table WHERE primary_key=...)

  2. Trap l'errore inserendo all'interno di una funzione plpgsql che ha un blocco EXCEPTION che ignora itr. Gli INSERT specifici che causano un duplicato verranno annullati ma la transazione non verrà interrotta.

Se hai inserimenti simultanei, questi metodi devono essere perfezionati con una strategia di blocco.