283 votes

Comment accélérer les performances d'insertion dans PostgreSQL

Je teste les performances d'insertion de Postgres. J'ai une table avec une colonne dont le type de données est un nombre. Il y a également un index sur cette colonne. J'ai rempli la base de données en utilisant cette requête :

insert into aNumber (id) values (564),(43536),(34560) ...

J'ai inséré 4 millions de lignes très rapidement, 10 000 à la fois, avec la requête ci-dessus. Lorsque la base de données a atteint 6 millions d'enregistrements, les performances ont considérablement diminué pour atteindre 1 million d'enregistrements toutes les 15 minutes. Existe-t-il un moyen d'améliorer les performances d'insertion ? J'ai besoin de performances d'insertion optimales pour ce projet.

J'utilise Windows 7 Pro sur une machine dotée de 5 Go de RAM.

5 votes

Il est utile de mentionner votre version Pg dans les questions également. Dans ce cas, cela ne fait pas une grande différence, mais c'est le cas pour beaucoup de questions.

1 votes

Abandonnez les index sur la table et les triggers s'il y en a et exécutez l'insert script. Une fois que vous avez terminé le chargement en masse, vous pouvez recréer les index.

4voto

Icarus Points 36951

Pour des performances d'insertion optimales, désactivez l'index si vous en avez la possibilité. En outre, un meilleur matériel (disque, mémoire) est également utile.

-7voto

Patrick Points 1473

J'ai également rencontré ce problème de performance d'insertion. Ma solution est de créer des routines pour terminer le travail d'insertion. En attendant, SetMaxOpenConns doit avoir un nombre approprié, sinon trop d'erreurs de connexion ouverte seront signalées.

db, _ := sql.open() 
db.SetMaxOpenConns(SOME CONFIG INTEGER NUMBER) 
var wg sync.WaitGroup
for _, query := range queries {
    wg.Add(1)
    go func(msg string) {
        defer wg.Done()
        _, err := db.Exec(msg)
        if err != nil {
            fmt.Println(err)
        }
    }(query)
}
wg.Wait()

La vitesse de chargement est beaucoup plus rapide pour mon projet. Cet extrait de code ne fait que donner une idée de son fonctionnement. Les lecteurs devraient être en mesure de le modifier facilement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X