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

Langage SQL Discussion :

update avec select


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 225
    Points : 97
    Points
    97
    Par défaut update avec select
    bonjour

    je n'arrive pas a faire un update de table a partir d'une requete sur une 2eme table.

    table 1 :
    x,y,i_pr,ii_pr,iii_pr ...xii_pr
    x et y coordoonnes point
    i_pr : pluvio pour mois de janvier
    ii_pr : pluvio pour mois de fevrier
    ...

    table 2 :
    mois,x,y,pr

    en sachant que : il y 550 000 points identiques / mois

    je voudrais faire un update sur la table 1 de maniere à mettre a jour le champs pr se trouvant dans table 2 pour chaque mois et chaque point
    exemple pour le mois de janvier mettre a jour la table 1 col i_pr a partir de la table 2 quand le mois = 1 et ceci pour tous les points identiques
    j'ai essaye ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    update table1 
    set ii_pr = (
      select pr 
      from table2 
      where mois=2 and x=table1.x and y= table1.y
    )
    mais ca tourne depuis maintenant 2300000 ms env. ....
    table2 comprend plus de 7 million de lignes et table1 comprend 550 000 env

    j'ai peur du produit cartesien !

    merci d'avance!
    n

  2. #2
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Ton SGBD ?
    As-tu des indexes sur la Table2 ?

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 225
    Points : 97
    Points
    97
    Par défaut
    hello

    je sous postgresql/postgis
    pas d'index....

  4. #4
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Pose un index sur la table2, colonnes x, y, mois.
    (par exemple)

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Vous n'avez pas mis de where au niveau de votre update... donc il va mettre à jour toute la table table1, en mettant null quand il ne trouve pas de correspondance.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    D'ailleurs en relisant votre sujet, vous mettez à jour toute la table 1 à partir de la table 2 ?

    Si oui, tronquez votre table1 et insérez le select qui va bien depuis la table2, ça ira nettement plus vite.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 225
    Points : 97
    Points
    97
    Par défaut
    hola tu es un ange!!
    j'ai créé un index sur x et y : resultat : update de 551716 lignes en moins d'une minutes!

    encore merci,
    n

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 225
    Points : 97
    Points
    97
    Par défaut
    waldar

    ma table 1 comporte env 550 000 lignes que je vais updater a coup sur sur le champs ii_pr qui correspond au champs pr de la table 2 et mois = 2 pour chaque x et y correspondant.

    d'ailleurs je sollicite a nouveau un avis :
    au depart j'ai une grosse table :
    mois, x , y , pr

    avec pour mois=1 : 550 000 point x,y avec val pr different
    ...pour les 12 mois de l'année, j'ai donc 550 000 points x,y qui se redondent pour tous les mois.

    j'ai donc créé la table 2 avec la structure :
    x, y, i_pr, ii_pr, iii_pr ....xii_pr
    ou je ne stocke finalement qu'une seule fois mes 550 000 points x,y (que j'ai effectievement intégré avec insert select )

    mon but est de mettre a jour tous les mois ii_pr, iii_pr, ... a partir de la tabel 1

    voila , je prend toutes les bonnes idees!
    merci,

    n

  9. #9
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    J'avoue ne pas bien comprendre ce que vous avez exactement dans votre base

    Pour chaque mois vous avez 550 000 lignes redondantes ???
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  10. #10
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Yaki => c'est pas vraiment redondant : ce sont des points de mesure différents. Ce qui est redondant, c'est que c'est répété pour chaque moi.

    Waldar => Vous êtes également un fan des méthodes barbares à la Tom Kyte
    Mais je pense que dans ce cas, on fait carrément CTAS de la requête, drop de la table, puis rename...

    Le seul truc, c'est que pour construire la requête, il faut le faire en récursif (puisqu'il y a une colonne par moi)

    nine => je voooollle

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  11. #11
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Oui et non car le nombre de mois par an ne devrait pas trop varier dans l'année.

    Je ferai effectivement ceci à la place de nine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    truncate table table1;
     
    insert into table1 (x, y, i_pr, ii_pr, ... xii_pr)
    select
        x, y,
        sum(case mois when 1 then pr else 0 end) as i_pr,
        sum(case mois when 2 then pr else 0 end) as ii_pr,
    ...
        sum(case mois when 12 then pr else 0 end) as xii_pr,
    from table2
    group by x, y
    order by x, y;
    Vu que vous faites au final un full scan de la table2, l'index sur table2 devient inutile pour ce chargement.

    Si votre SGBD le supporte vous pouvez aussi utiliser l'instruction PIVOT.

  12. #12
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Truncate table est a proscrire !! d'ailleurs je ne pense pas que son administrateur lui donne le droit de le faire. Cela by pass les journaux de log et de transactions, en cas de plantage durant la transaction la base est a mettre a la poubelle !!
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  13. #13
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Ce qui ne pose aucun problème vu que Table1 n'est qu'une modification visuelle de Table2.

  14. #14
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Avec le CTAS, tu ne fais le DROP que si le premier à réussi

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 225
    Points : 97
    Points
    97
    Par défaut
    yanika : peut importe le truncate, pour l'instant je suis sur machine, je cherche la façon la moins couteuse pour restructurer ma table

    waldar : un classique que je ne connaissais pas !
    est ce couteux/jouable sur des grosses tables ?

    j'ai rapidement regarde sur le net, posgresql ne gere pas pivot mais utilise crosstab, je vais faire des tests

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Vu que vous faites au final un full scan de la table2, l'index sur table2 devient inutile pour ce chargement.
    je ne suis pas sure de comprendre...en faisant comme disait pacmann un index sur x et y , j'ai reellement constaté la différence
    je crois que je n'ai jamais vraiment compris les index...

    merci a tous, a+
    n

  16. #16
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Pacman vous a proposé de poser des indexes au vu de votre requete qui comporte une clause WHERE.

    Waldar vous propose une solution de recreation de table, dans laquelle aucun clause WHERE n'est utilisée, d'ou le full scan sur la table, d'ou sa remarque de non necessité d'index.

    @Weldar : les instructions nons loggées ou faiblement loggées n'ont pas une portée limitée sur une table ou une cession concerant le journal de log.
    En cas de crash de votre base avant un checkpoint, le recovery de données va etre extrement périlleux apres l'utilisation d'un instruction non loggée.
    A vos risques et perils ...
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 225
    Points : 97
    Points
    97
    Par défaut
    merci yanika pour l'eclairage ;-)

    j'ai essayé la façon waldar...ça marche super bien --> sur la table de 7 millions de lignes la requete s'est executé en 176093 ms!

    c super je vous remercie vraiment tous beaucoup du coup de main.

    j'ai lu encore qu'on pouvait faire du crosstab voire utiliser cube, qu'en pensez-vous ? qqu'un l'a t'il deja expérimenté ?

    a+
    n

  18. #18
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Pour être plus complet et éviter le truncate, il faut prendre en compte que Table1 n'est qu'une "mise en page" de Table2, soit en quelque sorte une vue.

    Aussi, il vaudrait peut-être mieux créer Table1 comme étant une vue matérialisée de Table2.

    Les vue matérialisées (vues indexées en SQL Server) existent bien sous PostgreSQL : http://jonathangardner.net/tech/w/Po...rialized_Views

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 225
    Points : 97
    Points
    97
    Par défaut
    bonjour,

    je travaille toujours sur le meme projet, ca avance... et je dirai même ca avance grace a vous et a votre aide, alors merci.

    je bute a nouveau sur un probleme :

    maintenant que les donnees sources sont integrees dans mes tables
    je souhaite croiser les donnees user aves ces donnees sources

    le schema est :

    une table A : mois, x, y, i_val, ii_val, ...., xii_val
    une table B : mois, x, y, i_val, ii_val, ...., xii_val
    une table C : mois, x, y, i_val, ii_val, ...., xii_val
    ...

    un utilisateur upload un fichier et apres verif je l'integre dans une table :

    copy tmp_user_data from 'le fichier de l'utilisateur' using ...

    avec tmp_user_data : x,y

    ensuite je fais un calcul sur x et y pour trouver le point le plus proche (d'un maillage au pas de 1km sur la carte de la France env 550000 mailles)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE TABLE tmp_user (
      id serial,
      x_ori double precision,
      y_ori double precision,
      x_cal double precision,
      y_cal double precision  
    );
     
    --calcul du point le plus proche
    INSERT INTO tmp_user (x_ori,y_ori,x_cal,y_cal) SELECT x,y, round(x/10)*10 , round(y/10)*10 from tmp_user_data;
    me voila donc avec une table des données de l'utilisateur qui comporte les coordonnées d'origine et les coordonnées calculees pour tomber sur la maille la plus proche.

    je voudrais croiser ma table tmp_user avec chacune de mes tables A, B, et C

    ce que j'ai fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    create table resultat as 
    select b.x_ori,b.y_ori, b.x_cal, b.y_cal, A.i_val, ..., A.xii_val, B.i_val, ...B.xii_val,... 
    FROM tmp_user b, A,B, C 
    where A.x=b.x_cal and A.y=b.y_cal ...
    ceci me retourne tous les points x,y en concordance et je remonte bien les valeurs voulues de chacune des A, B et C pour les points x,y de l'utilisateurs.

    mais....je voudrais egalement garder les poitns x,y pour lesquels je n'ai pas de concordance car je dois faire un calcul de distance sur chacun d'eux
    je dois aussi garder l'ordre des poitns de l'utilisateur....
    est-ce possible ?

    le calcul de distance a faire pour chaque poitn non trouve est :
    racine carrée((x2-x1)²+(y2-y1)²)

    merci d'avance de votre aide
    n

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

Discussions similaires

  1. Requête update avec select imrbiqué
    Par Woufeigh dans le forum Requêtes
    Réponses: 1
    Dernier message: 05/05/2008, 00h43
  2. Requête Update avec Select.
    Par franzarelli dans le forum Langage SQL
    Réponses: 1
    Dernier message: 25/03/2008, 05h33
  3. Update avec Select : je n'y arrive pas.
    Par marye77 dans le forum Langage SQL
    Réponses: 15
    Dernier message: 22/02/2008, 16h51
  4. UPDATE avec SELECT sur la même table
    Par Invité dans le forum Langage SQL
    Réponses: 7
    Dernier message: 07/12/2007, 03h39
  5. Requete Update avec Select imbriqué: etrange resultat!
    Par corentone dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/08/2007, 15h05

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