IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

Equivalent d'un copy to


Sujet :

PostgreSQL

  1. #1
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut Equivalent d'un copy to



    Connaissez-vous un bon moyen de faire l'équivalent de cette commande ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    \copy (SELECT * FROM Main_View) to 'toto.csv' delimiter ';' csv
    Main_View étant une vue, il semble impossible d'écrire la commande sans la requête entre parenthèse et étant donné qu'il y a quelques millions d'enregistrements, j'aurais le temps de tuer ma machine avant qu'elle n'écrive la première ligne


    Je suis sous PostGreSQL 8.3 (mais toutes les aides y compris sur des versions plus récentes m'intéressent)

    par avance
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Et en quoi la commande telle quelle ne te convient pas?

  3. #3
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    Citation Envoyé par estofilo Voir le message
    Et en quoi la commande telle quelle ne te convient pas?


    Le temps d'exécution
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Ce n'est pas la méthode \copy en soi qui doit être lente, c'est le SELECT. Pour voir si c'est améliorable il faudrait un EXPLAIN du SELECT et les définitions de la vue et des tables sous-jacentes.

  5. #5
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    Citation Envoyé par estofilo Voir le message
    Ce n'est pas la méthode \copy en soi qui doit être lente, c'est le SELECT. Pour voir si c'est améliorable il faudrait un EXPLAIN du SELECT et les définitions de la vue et des tables sous-jacentes.

    En gros, c'est une vue sur une table avec des jointures sur des foreign pour afficher le champ textuel correspondant à la dite clé et une jointure sur la clé primaire pour "émuler l'héritage de table". Le choix de la table fille étant également déterminée par un case/when sur un champ. Certaines tables sont utilisées via une fonction d’agrégation pour fusionner en un champ textuel un ensemble de couples (nom, valeur)

    Il y a environ 2.5M d'enregistrements sur la table principale.

    Actuellement, la requête remplit ma RAM et au bout de 24h, je n'ai toujours aucun résultat... j'ai donc du passer par un script qui fait le travail en 2 étapes, d'abord une requête récupérant les Id, qui sont consommés au fur et à mesure par une requête sur la vue pour cet Id... Au final, il me faut près de 18h pour arriver au bout
    Fichiers attachés Fichiers attachés
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    D'après l'explain il y a un tri final. Ca rend effectivement impossible le fait d'avoir des résultats au fur et à mesure. L'ensemble des résultats est matérialisé en espace temporaire, puis trié, puis renvoyé.

    Juste en dessous on voit ça:
    Hash Join (cost=53.40..302632292689.69 rows=2151999 width=826)
    53.40 est le coût estimé pour sortir la 1ere ligne, et 302632292689 le coût pour l'ensemble des lignes.
    Donc ce plan indique que la 1ere ligne sortirait tout de suite s'il n'y avait pas le tri.

    Je suggèrerais bien de supprimer le ORDER BY du SQL voir ce que ça donne, et si c'est mieux de faire le tri post-SQL à partir du fichier CSV.

    Sous Unix, la commande sort ferait l'affaire si le CSV ne comporte pas de champs texte qui s'étalent sur plusieurs lignes.

  7. #7
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    Effectivement, j'avais oublié ce sort... je passe de 18h via un script à 8min en export via psql


    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. COPY equivalent WITH CSV HEADER sous postgres 7.4 ?
    Par Yoite dans le forum Débuter
    Réponses: 4
    Dernier message: 07/10/2009, 08h46
  2. equivalent "copy picture" MSP en vba
    Par nb_fr31 dans le forum Général VBA
    Réponses: 0
    Dernier message: 15/11/2007, 16h03
  3. [Kylix] Equivalent ShellExec en CLX
    Par Anonymous dans le forum EDI
    Réponses: 7
    Dernier message: 14/08/2002, 11h55
  4. Peux t'on créer une copie locale de l'objet partagé?
    Par Anonymous dans le forum CORBA
    Réponses: 8
    Dernier message: 16/04/2002, 16h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo