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 :

Requête trop lente, comment l'optimiser?


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de getz85
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2008
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2008
    Messages : 423
    Par défaut Requête trop lente, comment l'optimiser?
    Bonjour à tous.

    J'ai une requête qui pose problème dans mon programme car elle met bien 30 secondes à s'éxecuter.Cela vient du fait qu'il y a un filtre qui permet de ne pas sélectionner des éléments qui sont dans une liste.
    Mais il y a énormément d'élément à comparer!
    Voici la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT DISTINCT s.name, u.realname, dl.name 
    FROM software s, users u, computers c, licenses l,inst_software ins, dropdown_locations dl
    WHERE c.contact = u.name
    AND ins.cID = c.ID 
    AND ins.license = l.ID 
    AND l.sID = s.ID 
    AND dl.id = u.location 
    AND s.name 
    NOT IN('³öÆæÖÆÊ¤£*¸ß¿¼Ó¢Óï','#Supprimé','Acrobat Reader 4.0',
    'WinZip','Windows 2000 Support Tools','Windows 2000 Service Pack 4',
    'Windows 2000 Hotfix Special Release ...........
    le NOT IN continue sur 500 logiciels environ puis fin de la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ,'Windows Driver Package - FTDI FTDI VCP Driver Package','Windows Driver Package - FTDI CDM Driver Package',' ')
     AND dl.completename 
    IN('Informatique')  
    ORDER BY dl.name,u.realname
    Voila j'aimerais savoir comment rendre cette requête plus rapide.

    Merci d'avance

  2. #2
    Membre Expert Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Par défaut
    sans infos sur le SGBD, les volumétries, les indexes existants, ... etc difficile de deviner
    La théorie, c'est quand on sait tout mais que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

    Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/

  3. #3
    Membre éclairé Avatar de getz85
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2008
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2008
    Messages : 423
    Par défaut
    Citation Envoyé par scheu Voir le message
    sans infos sur le SGBD, les volumétries, les indexes existants, ... etc difficile de deviner
    Désolé
    Le SGBD c'est MySql.
    Qu'entends tu par volumétrie et indexes existants? le nombre d'occurences des tables?

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Par défaut
    Execute la requête que tu nous as présentée précédée du mot clé "EXPLAIN" comme celà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    EXPLAIN SELECT DISTINCT s.name, u.realname, dl.name 
    FROM software s, users u, computers c, licenses l,inst_software ins, dropdown_locations dl
    WHERE c.contact = u.name
    AND ins.cID = c.ID 
    AND ins.license = l.ID 
    AND l.sID = s.ID 
    AND dl.id = u.location 
    AND s.name 
    NOT IN('³öÆæÖÆÊ¤£*¸ß¿¼Ó¢Óï','#Supprimé','Acrobat Reader 4.0',
    'WinZip','Windows 2000 Support Tools','Windows 2000 Service Pack 4',
    'Windows 2000 Hotfix Special Release ...........
    Explain demande à MySQL d'executer la requête, mais au lieu de retourner le résultat de cette requête, il retourne sa manière de traiter ta requête. Ainsi tu pourras voir apparaître les manques en matière d'indexes.

    Donne le résultat de cette exécution ici.

  5. #5
    Membre éclairé Avatar de getz85
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2008
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2008
    Messages : 423
    Par défaut
    Merci de ta réponse.
    Voila le résultat
    id select_type table type possible_keys key key_len ref rows Extra
    1 SIMPLE ins ALL cID,sID NULL NULL NULL 102363 Using temporary; Using filesort
    1 SIMPLE c eq_ref PRIMARY PRIMARY 4 glpidb.ins.cID 1
    1 SIMPLE u ref name,name_2,location name 766 glpidb.c.contact 10 Using where
    1 SIMPLE l eq_ref PRIMARY,sID PRIMARY 4 glpidb.ins.license 1
    1 SIMPLE s eq_ref PRIMARY PRIMARY 4 glpidb.l.sID 1 Using where
    1 SIMPLE dl eq_ref PRIMARY PRIMARY 4 glpidb.u.location 1 Using where
    Désolé, ce n'est pas très lisible...

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Par défaut
    Si vous enlevez le distinct, y-a-t-il du mieux ? Et avez vous vraiment besoin du distinct ?

    Tout le reste de la requête (jointures et clause where) s'execute en utilisant des indexes.

Discussions similaires

  1. Optimisation de requêtes trop lentes..
    Par Nevrosl dans le forum Requêtes
    Réponses: 5
    Dernier message: 11/03/2010, 13h38
  2. Réponses: 21
    Dernier message: 03/08/2009, 13h32
  3. requête trop lente
    Par smaildba dans le forum SQL
    Réponses: 9
    Dernier message: 20/04/2009, 12h20
  4. Requête trop lente
    Par shadeoner dans le forum SQL
    Réponses: 11
    Dernier message: 23/05/2008, 10h24
  5. auto-killer une requête trop lente
    Par Nico57 dans le forum Oracle
    Réponses: 5
    Dernier message: 05/12/2006, 18h04

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