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 :

Mes requêtes SQL sont trop lentes


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Pgs
    Pgs est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 482
    Par défaut Mes requêtes SQL sont trop lentes
    Bonjour,

    Certaines de mes requêtes SQL sont trop lentes. Voici un exemple :

    - j'ai une table contenant une liste de projets : la table contient le numéro, le nom ainsi que la ville du projet
    - dans une autre table, j'ai la liste des opérations réalisées pour chaque projet : la table contient le numéro du projet, le type d'opération, la date et un commentaire.

    Ma requête doit me donner, pour une ville, la liste des projets avec, pour chaque projet, la date de la dernière opération de type "o1" et le commentaire correspondant.

    Ville | Projet | Date dernière o1 | Commentaire
    -----------------------------------------------------
    Nancy | P45 | 16/05/2008 |
    Nancy | P79 | 12/06/2008 | RAS

    Voici comment je m'y prend :

    a) Sous requête 1 : select sur la table projet avec where ville='Nancy'
    b) Sous requête 2 : je cherche à obtenir la dernière opération o1 pour chaque projet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select op.* 
    from operations op, 
    (select x.projet, x.operation, max(x.opdate) as datemax 
     from operations x 
     group by  x.projet, x.operation) opmax 
    where op.projet=opmax.projet 
     and op.operation=opmax.operation 
     and op.opdate=opmax.datemax
    c) J'établis un left join (sur le code projet) entre ma sous-requête 1 et ma sous-requête 2.

    J'obtiens le résultat attendu, mais c'est vraiment très long à l'exécution.

    Comment puis-je optimiser cette requête ? Je me pose en particulier deux questions :
    - le filtre sur la ville que je fais dans ma sous-requête 1 est il bien placé ? Serait il mieux après ma jointure left join ?
    - ma sous-requête 2 qui vise à obtenir la dernière op1 de chaque projet peut elle être allégée ?

    Merci pour toute aide

    Philippe

  2. #2
    Membre Expert 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
    Par défaut
    Pourquoi utiliser une sous requete dans votre requete 2 ?

  3. #3
    Pgs
    Pgs est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 482
    Par défaut
    Dans ma table des opérations je veux retenir, pour chaque projet, la date de la dernière opération "o1" :

    Enreg|Proj. |Op| Date op | Commentaire
    ---------------------------------
    3200| P45 | o1 | 14/03/2008 | Envoyer rapport intervention
    4003| P79 | o2 | 12/05/2008 | RAS
    4128| P45 | o1 | 16/05/2008 |
    5123| P79 | o1 | 12/06/2008 | RAS


    L'enregistrement 3200 ne doit pas être retenu car le 4128 est plus récent.
    L'enregistrement 4003 ne doit pas être retenu car il concerne pas l'opération "o1".

    Cordialement

    Phil

  4. #4
    J1
    J1 est déconnecté
    Membre expérimenté Avatar de J1
    Inscrit en
    Mai 2004
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 321
    Par défaut
    Bonjour,

    si tu souhaites obtenir, pour chaque projet, la dernière opération de type o1, tu dois ajouter une condition à ta sous-requête 2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT op.*
    FROM   operations op,
           (SELECT   x.projet,
                     x.operation,
                     MAX(x.opdate)  AS datemax
            FROM     operations x
            WHERE    x.operation = 'o1'
            GROUP BY x.projet,x.operation) opmax
    WHERE  op.projet = opmax.projet
           AND op.operation = opmax.operation
           AND op.opdate = opmax.datemax
    Ce qui, accessoirement, devrait améliorer tes temps de traitement puisque ta table dérivée opmax va renvoyer moins de lignes.

  5. #5
    Pgs
    Pgs est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 482
    Par défaut
    Merci J1,

    Malheureusement, je le fais déjà. Afin de poser ma question clairement, j'avais simplifié mon exemple. En réalité, ma requête fait apparaître, pour chaque projet, la dernière date de chaque opération. J'ai donc autant de sous requêtes que d'opération (et, pour chaque sous-requête, j'ai "where operation='o1' "etc.).

    Ce qui est fou c'est que même quand je lance ma requête pour une seule opération (avec where operation='o1' dans ma sous requête 2), ça prend un temps d'exécution incroyable.

  6. #6
    Membre Expert 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
    Par défaut
    et un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT * from operations op
    group by projet, operation
    HAVING max(opdate)=opdate
    ne serait pas suffisant ?

Discussions similaires

  1. Mes requêtes SQL sont-elles correctes ?
    Par romca dans le forum Langage SQL
    Réponses: 5
    Dernier message: 05/08/2008, 17h23
  2. "Blinder" mes requêtes SQL
    Par Tread dans le forum JDBC
    Réponses: 2
    Dernier message: 14/05/2008, 15h49
  3. [SQL] Optimisation de mes requêtes SQL
    Par webAbsolu dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 14/10/2007, 16h54
  4. Vérifier que mes connexions SQL sont bien fermées
    Par Guilhem_mdg dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 26/02/2007, 16h26
  5. Réponses: 2
    Dernier message: 04/03/2006, 10h47

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