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

Requêtes et SQL. Discussion :

Optimiser une requête pour diminuer le temps d'execution


Sujet :

Requêtes et SQL.

  1. #1
    Membre habitué Avatar de Milyshyn76
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2007
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Seine Maritime (Haute Normandie)

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 440
    Points : 158
    Points
    158
    Par défaut Optimiser une requête pour diminuer le temps d'execution
    Bonjour à tous,
    J'ai une requête alimentant un état assez longue.

    Quelqu'un aurait-il une idée pour la raccourcir un peu ...

    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
    SELECT 
    T_Client.C_Id, 
    T_Client.C_Nom, 
    T_Client.C_Conducteur, 
    T_Client.C_NouvAdVille, 
    T_Client.C_Statut, 
    T_Client.C_NouvAdCP, 
    T_CorpsEtat.CE_Id, 
    T_CorpsEtat.CE_Libelle, 
    T_Tiers.T_Nom, 
    T_Commande.Co_DateCommande, 
    T_Commande.Co_DatePrevInt, 
    T_Commande.Co_DateOrdre, 
    T_Commande.Co_ContreSigne
     
    FROM 
     
    (T_Commande 
    INNER JOIN ((T_CorpsEtat INNER JOIN T_LigneAnalytique 
    ON T_CorpsEtat.CE_Id = T_LigneAnalytique.LA_CEId) 
    INNER JOIN T_Client 
    ON T_LigneAnalytique.LA_ClientId = T_Client.C_Id) 
    ON T_Commande.Co_LigneAnalytique = T_LigneAnalytique.LA_Id) 
    INNER JOIN T_Tiers 
    ON T_Commande.Co_Entreprise = T_Tiers.T_Id
    WHERE (((T_Client.C_Statut)="En Cours de Travaux"))
    ORDER BY T_Client.C_Id;
    Merci Beaucoup

  2. #2
    Membre chevronné
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    Points : 2 178
    Points
    2 178
    Par défaut
    Bonjour,
    Il est necessaire parfois de décomposer une requête en plusieurs, en utilisant des tables intermediaires pour gagner du temps. L'ordre de ces requêtes peut varier en fonction du volume de données à traiter et en fonction des critères de sélection utilisés.
    La première requête pourrait sélectionner les clients "En cours de travaux" par exemple.
    Les suivantes travailleront sur un volume plus restreint de données.

  3. #3
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 863
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 863
    Points : 58 438
    Points
    58 438
    Billets dans le blog
    44
    Par défaut
    Bonjour,

    Si les clés des tables sont normalement indexées et sont de types numérique entier, Access devrait faire correctement son boulot et je ne vois pas comment optimiser davantage…
    Peut-être une idée à tester en rajoutant une table T_Statut(C_statut (NumAuto), LibelleStatut(texte)), puis modifier la restriction WHERE :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE T_Client.C_Statut=2
    (Vérifier que la clé étrangère T_Client.C_Statut est bien indexée "oui – avec doublons")

    D’un autre côté si tu tiens absolument à ramener le libellé du statut correspondant dans le SELECT (si c’est pour mettre dans un état, ce n’est peut-être pas utile de ramener x fois le même libellé "En cours de travaux", non ?), il va falloir rajouter une jointure supplémentaire avec T_Statut alors…

  4. #4
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Faites une recherche avec ShowPlan.Out afin de voir comment visualiser le plan d'exécution de votre requête. En fonction de ce plan, vous serez en mesure de voir où des index pourraient être placé. N'hésitez pas à coller votre plan d'exécution ici afin que l'on puisse voir ensemble si le traitement est normal ou non.

    Mais à priori, il suffirait dans un premier temps de faire l'inner join de la sous requete renvoyant les clients "En cours de travaux" plutot que l'INNER JOIN de tous les clients.

Discussions similaires

  1. Recherche d'informations pour optimiser une requête
    Par zaza78 dans le forum Administration
    Réponses: 2
    Dernier message: 20/08/2010, 16h00
  2. Positionnement d'index pour optimiser une requête
    Par Monstros Velu dans le forum Développement
    Réponses: 14
    Dernier message: 17/02/2010, 17h53
  3. Optimisation de requête pour une messagerie
    Par okin66 dans le forum Requêtes
    Réponses: 0
    Dernier message: 31/05/2009, 16h39
  4. Réponses: 2
    Dernier message: 26/09/2008, 23h32
  5. besoin d'aide pour optimiser une requête
    Par jisse dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/01/2006, 10h41

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