PostgreSQL
La base de données la plus sophistiquée au monde.

Ouverture de session

Navigation

Contactez-nous

Administration du site :
"equipe chez postgresqlfr point org"

Contact presse :
"fr chez postgresql point org"

Contact association :
"bureau chez postgresqlfr point org"

Questions PostgreSQL :
 IRC :
  serveur irc.freenode.net
  canal #postgresqlfr

Recherche

Accéder aux archives

« Octobre 2008  
Lun Mar Mer Jeu Ven Sam Dim
  2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31  

Syndication

Flux XML

Sondage

Quelle est la version de PostgreSQL la plus répandue sur vos serveurs ?
8.3
10%
8.2
42%
8.1
40%
8.0
2%
7.4
6%
7.3 ou antérieure
0%
Nombre de votes: 48

Chargement d'un grand nombre de données, avec UPDATE sur condition

Technique - général | Chargement d'un grand nombre de données, avec UPDATE sur condition

Par paftek le 06/11/2007 - 12:41

Bonjour,

Mon application permet à l'utilisateur d'importer un certain nombre de données. Cela peut aller de quelques lignes à plusieur milliers.

De plus, je souhaite qu'un import puisse faire office de mise à jour : si je trouve que l'objet est déjà présent dans la base en évaluant une condition particulière, ne dépendant pas seulement de la clé primaire, je le mets à jour.

Je me suis intéressé à la commande COPY mais il me semble qu'elle ne permet pas de faire des UPDATE au besoin.
J'ai téléchargé pgloader mais j'ai l'impression qu'il utilise la commande COPY.

Quel serait le moyen le plus performant d'importer et/ou mettre à jour un grand nombre de données ?
Dois-je faire de simples INSERT en associant des RULE ou TRIGGER ? Existe-t'il un moyen plus subtil et rapide ?

Merci d'avance pour toute réponse !

Julien S.

Options d'affichage des commentaires

Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder les paramètres" pour activer vos changements.

qq idées : * tout mettre

sparky/ = 6 Novembre, 2007 - 15:12

qq idées :

* tout mettre dans une table et puis lancer une procédure plpgsql,
* trigger before insert/update
* procédure stockée select add_or_update(valeur,....)

Il y a probablement d'autres façons, personnellement je préfère le trigger, la régle sera toujours évaluée même si j'essaie insérer manuellement


Merci pour ces quelques idée

paftek/ = 9 Novembre, 2007 - 15:31

Merci pour ces quelques idées !

Je vais mettre en pratique tout ça, et je ferai un retour si jamais ça intéresse quelqu'un.


Retour

SAS/ = 16 Novembre, 2007 - 13:28

Oui, oui, un retour intéressera sûrement quelqu'un !

Librement,
Stéphane Schildknecht
dalibo
PostgreSQLFr


Premier retour

paftek/ = 29 Novembre, 2007 - 13:08

Bon,

A ce jour, la solution adoptée n'a rien de spectaculaire :
Je tente systématiquement un UPDATE. Si aucune ligne n'a été modifiée, j'effectue un INSERT.

Je n'ai rien trouvé de mieux, car j'ai plusieurs contraintes à respecter (je me rends compte que j'avais oublié de vous les exposer) :
- L'utilisateur n'est pas obligé de remplir toutes les colonnes
- Lors d'un INSERT, certains colonnes doivent être obligatoirement remplies
- Lors d'un UPDATE, les colonnes obligatoires précitées ne sont plus forcemment requises : on doit pouvoir mettre à jour qu'une seule colonne, par exemple

Pour résumer, on respecte les colonnes obligatoires lors d'un INSERT, mais cette contrainte disparaît lors d'un UPDATE. De plus, un UPDATE doit pouvoir porter sur un nombre quelconque de colonnes (les autres restant intouchées).

Je ne vois pas comment faire autrement, alors n'hésitez pas à me proposer d'autres idées,
Merci !


Deuxième retour

paftek/ = 6 Mai, 2008 - 17:34

Bonjour,

La solution précédente était finalement loin d'être satisfaisante.
Je me suis inspiré de cet excellent article pour une nouvelle version :
http://www.depesz.com/index.php/2007/09/20/copy-to-existing-table-with-updates/

Résultat ? Le tout est grosso modo 100 fois plus rapide.

Etapes du traitement :
- Lecture du fichier CSV source et pré-traitement en Python
- Chargement des données dans des tables temporaires, au moyen de la commande COPY
- Requêtes INSERT et UPDATE
- Requêtes SQL de post-traitement

C'était finalement pas si compliqué :)


© PostgreSQLFr, tous droits réservés.
Site déclaré à la CNIL sous le numéro 1074678, conformément à la Loi en vigueur.