Vous n'êtes pas identifié(e).
Pages : 1
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
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
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.
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
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
Pages : 1