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 :

Une requête qui se plante


Sujet :

Langage SQL

  1. #1
    Membre averti
    Avatar de witch
    Inscrit en
    Mai 2007
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2007
    Messages : 346
    Points : 335
    Points
    335
    Par défaut Une requête qui se plante
    Bonjour,

    J'ai besoin d'une ptite aide ....
    j'essaie de maintenair cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select SDA.code_demande_achat as code_demande ,SDA.numero_demande  ,
    date_mouvement,  code_mouvement,V_Stk_mouvement.libelle,  num_liv, 
    GM.code_magasin,GM.libelle as libelle_magasin, magasin_id, CR.code_centre, 
    CR.designation as designation_centre,   p.code_produit , p.PRODUIT_ID  , p.DESIGNATION , 
    QTE_MV  , V_Stk_mouvement.PRIX_ACHAT, 1 as idu  
    FROM  V_Stk_mouvement  VSM
    inner  join gen_produit p on VSM.CODE_PRODUIT = p.code_produit    
    inner join STK_LIVRAISON_interne on STK_LIVRAISON_interne.CODE_LIVRAISON= V_Stk_mouvement.CODE_LIVRAISON_I  
    inner join stk_ligne_livraison_interne LLI  on  STK_LIVRAISON_interne.code_livraison = lli.code_livraison 
    inner join STK_LIVRAISON_DEMANDE_ACHAT LDA ON LLI.CODE_LIGNE_LIVRAISON  = LDA.CODE_LIGNE_LIVRAISON inner  join stk_demande_achat  SDA on LDA.CODE_DEMANDE_ACHAT = SDA.CODE_DEMANDE_ACHAT  
    inner join  gen_centre_responsabilite CR on CR.code_centre = STK_LIVRAISON_interne.code_centre inner join gen_magasin GM on GM.code_magasin = V_Stk_mouvement.CODE_MAGASIN  left outer  join Gen_produit_H p1 on p.CODE_PRODUIT=P1.ref  
    left outer join Gen_produit_H P2 On P1.code_h like P2.code_h  + '.%' and upper(P2.type) like 'FAMILLE' AND P2.SOUS_FAMILLE=0 AND NOT EXISTS (SELECT CODE_H FROM Gen_produit_H F WHERE upper(F.type) = 'FAMILLE' AND F.CODE_H LIKE P2.CODE_H + '.%' AND F.SOUS_FAMILLE=0) 
    left outer join Gen_produit_H P3 On p1.code_h like p3.code_h   +   '.%' and upper(p3.type) like 'NATURE' AND NOT EXISTS (SELECT CODE_H FROM Gen_produit_H N WHERE upper(N.type) = 'NATURE' AND N.CODE_H LIKE P3.CODE_H + '.%') where upper(P1.type) like 'PRODUIT' and qte_mv > 0 and   VSM.type like 'S'
    ça se plante grave , il est déjà 11 minutes que cette requête est entrain de se traiter au niveau de sql server, et toujours pas de résultats

    quelqu'un à une idée pour résoudre ce problème?

    Merci
    If a pretty poster and a cute saying are all it takes to motivate you, you probably have a very easy job. The kind robots will be doing soon.

  2. #2
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 70
    Points : 66
    Points
    66
    Par défaut
    On pourrait avoir le message d'erreur associé au plantage ?

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 762
    Points
    30 762
    Par défaut
    Je n'ai pas pris le temps de lire en détail ta requête mais il n'est pas inutile de vérifier qu'il n'y a pas de produit cartésien perdu au milieu des conditions de jointure.

    Quand une requête de ce type commence à prendre beaucoup de temps, il faut commencer par vérifier le plan d'exécution pour s'assurer que les bons index sont utilisés ou s'il ne faut pas en rajouter.

    Par ailleurs toutes les tables utilisées dans la requête sont elles nécessaires pour le résultat attendu ?

    Une bonne mise en forme de la requête permet souvent de voir des choses qui se trouvent perdues au milieu de lignes trop longues.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 792
    Points : 34 016
    Points
    34 016
    Billets dans le blog
    14
    Par défaut
    J'ai remis la requête en forme :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    SELECT 
      SDA.code_demande_achat AS code_demande, SDA.numero_demande,
      date_mouvement, code_mouvement,
      VSM.libelle,  
      num_liv, 
      GM.code_magasin, GM.libelle AS libelle_magasin, 
      magasin_id, 
      CR.code_centre, CR.designation AS designation_centre,
      p.code_produit, p.PRODUIT_ID, p.DESIGNATION, 
      QTE_MV, 
      VSM.PRIX_ACHAT, 
      1 AS idu  
    FROM V_Stk_mouvement AS VSM
    INNER JOIN gen_produit AS p ON VSM.CODE_PRODUIT = p.code_produit    
    INNER JOIN STK_LIVRAISON_interne AS SLI ON SLI.CODE_LIVRAISON = VSM.CODE_LIVRAISON_I  
      INNER JOIN stk_ligne_livraison_interne AS LLI ON SLI.code_livraison = LLI.code_livraison 
        INNER JOIN STK_LIVRAISON_DEMANDE_ACHAT AS LDA ON LLI.CODE_LIGNE_LIVRAISON  = LDA.CODE_LIGNE_LIVRAISON 
          INNER JOIN stk_demande_achat AS SDA ON LDA.CODE_DEMANDE_ACHAT = SDA.CODE_DEMANDE_ACHAT  
      INNER JOIN gen_centre_responsabilite AS CR ON CR.code_centre = SLI.code_centre 
    INNER JOIN gen_magasin AS GM ON GM.code_magasin = VSM.CODE_MAGASIN  
      LEFT OUTER JOIN Gen_produit_H AS p1 ON p.CODE_PRODUIT = P1.ref  
        LEFT OUTER JOIN Gen_produit_H AS P2 ON P1.code_h LIKE P2.code_h + '.%' 
          AND upper(P2.type) LIKE 'FAMILLE' 
          AND P2.SOUS_FAMILLE = 0 
          AND NOT EXISTS (
            SELECT CODE_H 
            FROM Gen_produit_H F 
            WHERE upper(F.type) = 'FAMILLE' 
              AND F.CODE_H LIKE P2.CODE_H + '.%' AND F.SOUS_FAMILLE = 0
          ) 
        LEFT OUTER JOIN Gen_produit_H AS P3 ON p1.code_h LIKE p3.code_h + '.%' 
          AND upper(p3.type) LIKE 'NATURE' 
          AND NOT EXISTS (
            SELECT CODE_H 
            FROM Gen_produit_H N 
            WHERE upper(N.type) = 'NATURE' 
              AND N.CODE_H LIKE P3.CODE_H + '.%'
          ) 
    WHERE upper(P1.type) LIKE 'PRODUIT' 
      AND qte_mv > 0 
      AND VSM.type LIKE 'S'
    Wow !

    Remarques :
    1) Dans le SELECT, il y a des colonnes préfixées d'un alias de table et d'autres pas. Cà n'aide pas le SGBD pour la recherche des colonnes et la requête est du coup moins facile à comprendre.

    2) Il ya des tables qui bénéficient d'un alias, mais pas utilisé partout, et d'autres non.
    Dans la remise en forme ci-dessous, j'ai mis des alias sur toutes les tables et les ai utilisés partout où je pouvais mais je ne peux pas deviner d'où viennent les colonnes non préfixées.

    3) On voit des LIKE qui pourraient être des =
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    AND upper(P2.type) LIKE 'FAMILLE'
     
    AND upper(p3.type) LIKE 'NATURE'
     
    WHERE upper(P1.type) LIKE 'PRODUIT' 
     
    AND VSM.type LIKE 'S'
    4) Les conditions des deux dernières jointures externes n'aident pas à l'optimisation des performances.
    Ne serait-il pas possible de transférer ces conditions dans le WHERE ?

    Après, comme dit plus haut, il faut voir l'indexage des tables mais c'est sûr que les LIKE empêchent l'utilisation des index.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre averti
    Avatar de witch
    Inscrit en
    Mai 2007
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2007
    Messages : 346
    Points : 335
    Points
    335
    Par défaut
    Bonjour à tous,

    Pour la remise en forme c'est parce que c'est au niveau du vb que ça s'exécute c'est pour cela que j'ai vite mis les sources pour les tester par la suite sous sql server...
    j'ai remarqué qu'il y avait présence des doublons, donc j'ai ajouté un group by, mais la requête est toujours lente..ça met 14 minutes et 45 secondes pour juste 6123 lignes !!
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    SELECT 
      SDA.code_demande_achat AS code_demande, SDA.numero_demande,
      date_mouvement, code_mouvement,
      VSM.libelle,  
      num_liv, 
      GM.code_magasin, GM.libelle AS libelle_magasin, 
      magasin_id, 
      CR.code_centre, CR.designation AS designation_centre,
      p.code_produit, p.PRODUIT_ID, p.DESIGNATION, 
      QTE_MV, 
      VSM.PRIX_ACHAT, 
      1 AS idu  
    FROM V_Stk_mouvement AS VSM
    INNER JOIN gen_produit AS p ON VSM.CODE_PRODUIT = p.code_produit    
    INNER JOIN STK_LIVRAISON_interne AS SLI ON SLI.CODE_LIVRAISON = VSM.CODE_LIVRAISON_I  
      INNER JOIN stk_ligne_livraison_interne AS LLI ON SLI.code_livraison = LLI.code_livraison 
        INNER JOIN STK_LIVRAISON_DEMANDE_ACHAT AS LDA ON LLI.CODE_LIGNE_LIVRAISON  = LDA.CODE_LIGNE_LIVRAISON 
          INNER JOIN stk_demande_achat AS SDA ON LDA.CODE_DEMANDE_ACHAT = SDA.CODE_DEMANDE_ACHAT  
      INNER JOIN gen_centre_responsabilite AS CR ON CR.code_centre = SLI.code_centre 
    INNER JOIN gen_magasin AS GM ON GM.code_magasin = VSM.CODE_MAGASIN  
      LEFT OUTER JOIN Gen_produit_H AS p1 ON p.CODE_PRODUIT = P1.ref  
        LEFT OUTER JOIN Gen_produit_H AS P2 ON P1.code_h LIKE P2.code_h + '.%' 
          AND upper(P2.type) LIKE 'FAMILLE' 
          AND P2.SOUS_FAMILLE = 0 
          AND NOT EXISTS (
            SELECT CODE_H 
            FROM Gen_produit_H F 
            WHERE upper(F.type) = 'FAMILLE' 
              AND F.CODE_H LIKE P2.CODE_H + '.%' AND F.SOUS_FAMILLE = 0
          ) 
        LEFT OUTER JOIN Gen_produit_H AS P3 ON p1.code_h LIKE p3.code_h + '.%' 
          AND upper(p3.type) LIKE 'NATURE' 
          AND NOT EXISTS (
            SELECT CODE_H 
            FROM Gen_produit_H N 
            WHERE upper(N.type) = 'NATURE' 
              AND N.CODE_H LIKE P3.CODE_H + '.%'
          ) 
    WHERE upper(P1.type) LIKE 'PRODUIT' 
      AND qte_mv > 0 
      AND VSM.type LIKE 'S'
    GROUP BY 
    SDA.code_demande_achat ,date_mouvement,   SDA.numero_demande , 
    code_mouvement,VSM.libelle,  num_liv, 
    GM.code_magasin,GM.libelle , magasin_id, CR.code_centre, 
    CR.designation ,  p.code_produit , p.PRODUIT_ID  , 
    p.DESIGNATION , QTE_MV  , VSM.PRIX_ACHAT
    HAVING count(*) = 1
    Merci
    If a pretty poster and a cute saying are all it takes to motivate you, you probably have a very easy job. The kind robots will be doing soon.

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 762
    Points
    30 762
    Par défaut
    A quoi servent les jointures externes sur P2 et P3 ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Membre averti
    Avatar de witch
    Inscrit en
    Mai 2007
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2007
    Messages : 346
    Points : 335
    Points
    335
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    A quoi servent les jointures externes sur P2 et P3 ?
    Tu veux que je te dises....je ne sais pas vraiment, ce n'est pas moi qui a fait cette requête, tout ce que je dois faire c'est de la maintenir, je suis comme vous, j'esssaie de deviner
    If a pretty poster and a cute saying are all it takes to motivate you, you probably have a very easy job. The kind robots will be doing soon.

Discussions similaires

  1. [SQL] une requête qui ne s'arrête pas ou si loin
    Par lodan dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 12/10/2006, 15h36
  2. Réponses: 8
    Dernier message: 26/01/2006, 15h47
  3. une requête qui selectionne la ligne max
    Par kuhnden dans le forum Access
    Réponses: 3
    Dernier message: 01/11/2005, 19h39
  4. Une requête qui ne reconnait pas is not null
    Par LeBauw dans le forum Access
    Réponses: 2
    Dernier message: 08/09/2005, 13h29
  5. [...] doit utiliser une requête qui peut être mise à jour
    Par requiemforadream dans le forum ASP
    Réponses: 4
    Dernier message: 26/04/2005, 10h12

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