PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 05/04/2017 23:43:06

meles
Membre

[resolu] Performance de \copy

Bonsoir à tous,
  pour mes besoins au boulot, je crée régulièrement une BDD sous postgresql en important une ribambelle de CSV avec la commande copy via des scripts sql lus par psql. Les plus grosse tables doivent faire quelques dizaine de milliers lignes, voire centaines pour 2 ou 3 d'entre elles (mais avec peu de colonnes), mais pas beaucoup plus.

Je trouve pas ça toujours très rapide (j'utilise une station de travail comme serveur).

Y'a il une methode plus rapide/efficace pour injecter mes données en bases ? un ETL ? python+pandas ? Une stratégie a adopter dans les scripts ?

Cordialement

Dernière modification par meles (06/04/2017 23:14:35)

Hors ligne

#2 06/04/2017 08:35:15

ruizsebastien
Membre

Re : [resolu] Performance de \copy

Bonjour,

De ma propre expérience copy est très performant et souvent meilleur que les ETL quand il s'agit de charger des données sans transformation.
Si vous avez des performances dégradées il faudrait plutôt regarder du côté des traces de votre instance postgresql et voir s'il n'y a pas des contentions du côté de l'autovacuum ou du checkpoint.
Les ordres copy sont lancés directement sur le serveur ? Avec les csv aussi sur le serveur ?

Cordialement.


Cordialement,

Sébastien.

Hors ligne

#3 06/04/2017 18:06:18

dverite
Membre

Re : [resolu] Performance de \copy

pg_bulkload peut être plus rapide en prenant des libertés avec certaines contraintes et en parallélisant

Voir http://ossc-db.github.io/pg_bulkload/index.html

Sinon copy sera d'autant plus rapide qu'il écrit dans une table sans contrainte d'intégrité référentielle, sans index, sans trigger.
Si la table est créée à vide, ou qu'elle subit un TRUNCATE, il est préférable de supprimer ces propriétés pour le chargement et les remettre après. S'il y a déjà des données dedans ça dépend combien il y en a en proportion des nouvelles, et si d'autres sessions peuvent en avoir besoin pendant l'import.

Si la table n'existe pas au départ, l'option FREEZE peut aider aussi, voir la doc de COPY relative à la version de PostgreSQL utilisée.

Hors ligne

#4 06/04/2017 23:13:30

meles
Membre

Re : [resolu] Performance de \copy

Bonsoir et merci de vos réponses, j'ai fait des essais avec FREEZE (je recrée mes tables a chaque fois donc elle sont vides)  et effectivement, j'ai gagné près de 30 % de temps de remplissage.

Merci a tous

Hors ligne

Pied de page des forums