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

SQL Oracle Discussion :

Optimisation de requête de mise à jour


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 618
    Par défaut Optimisation de requête de mise à jour
    Bonjour,

    Je souhaite mettre à jour le prix d'inventaire des articles à partir de la dernière livraison avant la fin de l'exercice et de la ligne de commande d'achat correspondante.

    Pour cela je rapproche la table des lignes de livraison de la table des lignes de commandes d'achat dans une vue.
    Puis je transforme le montant de la ligne de commande d'achat en unité de stock.
    Ensuite j'effectue la mise à jour de mon article.
    Problème: je n'arrive pas à faire la mise à jour (après plus d'une heure d'attente, la mise à jour n'est pas réalisée).

    Voici mes scripts SQL:

    Le script de la vue pour rapprocher les livraisons des lignes de commandes d'achat et des commandes d'achat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    select al.id_article,al.id_achat_ligne, al.mnt_total_ht, al.nb_lot_cmde, al.qte_cmde, al.lg_cmde, al.tot_cmde, al.id_unite_cmde, al.id_unite_tot_cmde, tmp.date_livre, ach.num_achat
    from toperp.t_achat_ligne al
    inner join 
    (
    SELECT  a.id_article
          ,max(a.date_livre) AS date_livre
          ,max(a.id_achat_ligne) keep (dense_rank first order by date_livre DESC) AS id_achat_ligne
     FROM t_achat_bl_ligne a    
    WHERE a.date_livre < TO_DATE('30/09/2011','DD/MM/YYYY')
    GROUP BY a.id_article
    ) tmp
    on tmp. id_achat_ligne  = al.id_achat_ligne
    inner join toperp.t_achat ach
    on al.id_achat = ach.id_achat
     where al.mnt_total_ht > 0
    Mon script de calcul de coût que je n'arrive pas à faire passer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    UPDATE T_ARTICLE ART 
              SET PU=(SELECT tmp.cout_unit 
                             FROM  ( select a.id_article, 
                                                  b.MNT_TOTAL_HT / (b.NB_LOT_CMDE  *                                            b.qte_cmde *  b.lg_cmde )  as cout_unit
                                        from t_article a, V_RAPPRO_BL_ACHAT b
                                        where a.id_article      = b.id_article  
                                           and  a.id_unite_stock = id_unite_cmde                          
        and  b.id_unite_cmde  <> b.id_unite_tot_cmde
        and  a.id_groupe_article in (1,3)) tmp 
             WHERE ART.id_article=tmp.id_article)
    Merci d'avance.
    Julien.

  2. #2
    Membre très actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Par défaut
    Peux tu nous mettre les plan d'executions de ta vue ?

    Volumes des tables ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT /*+ gather_plan_statistics */
    ....
     
    SELECT *
    FROM
        TABLE (dbms_xplan.display_cursor (format=>'ALLSTATS LAST'));

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 618
    Par défaut
    La table T_article contient 46602 lignes. Il y a un index pk sur id_article. Par contre il n'y a rien sur l'id_unite_stock.

    J'ai créé la vue en question. Elle contient 5608 enregistrements.

    J'ai un message Erreur SQL lorsque je lance votre requête sur SQLDEVELOPPER. Je suis sous Oracle 10g.
    Julien.

  4. #4
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Utilisez Merge à la place de l'update.
    Quelle version d'Oracle ?

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 618
    Par défaut
    En consultant l'aide sur Oracle, le merge me permet de dissocier les update et les insert. Je conserve donc l'usage de l'update. Je ne vois pas comment cela pourrait me faire gagner du temps.

    Je suis sur Oracle 10g.

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    le merge me permet de dissocier les update et les insert.
    Pas que : merge enhancements in 10g
    La table T_article contient 46602 lignes
    ...
    J'ai créé la vue en question. Elle contient 5608 enregistrements.
    Ton UPDATE tel que tu l'écris va mettre à jour les 46602 lignes de la table alors que la vue permettant le calcul ne contient que 5608 lignes.
    Sans correspondance la colonne PU sera MAJ à NULL, est ce vraiment ce dont tu as besoin ?
    Le MERGE pourrait peut être s'écrire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    merge into T_ARTICLE ART
    using (SELECT b.id_article,b.id_unite_cmde, b.MNT_TOTAL_HT / (b.NB_LOT_CMDE  * b.qte_cmde * b.lg_cmde )  AS cout_unit
             FROM V_RAPPRO_BL_ACHAT b
            WHERE b.id_unite_cmde  <> b.id_unite_tot_cmde) tmp
       on art.id_article      = tmp.id_article
      AND art.id_unite_stock  = tmp.id_unite_cmde
     when MATCHED then 
      set art.PU = tmp.cout_unit
    where art.id_groupe_article IN (1,3)

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

Discussions similaires

  1. Requête de mise à jour
    Par Daniel MOREAU dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 04/09/2006, 14h18
  2. Problème avec une requête de mise à jour
    Par Le Pharaon dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 11/07/2006, 12h16
  3. Requête de mise à jour
    Par Deejoh dans le forum Access
    Réponses: 4
    Dernier message: 24/05/2006, 12h02
  4. Réponses: 2
    Dernier message: 10/03/2006, 13h55
  5. Réponses: 6
    Dernier message: 29/11/2005, 19h36

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