Une requette trop longue >> 'Explain' peut il m'aider? - SQL/NoSQL - Programmation
Marsh Posté le 20-10-2005 à 17:24:42
ta requète est vraiment mal foutue :S
Pour optimisé une requete, faut faire des index sur les primary keys et sur les reference keys.
Ensuite, l'utilisation de l'opérateur EXISTS (corrélation) accélère également les requètes sql (quand on sait utiliser cette opérateur correctement)...
dernière question? c'est quoi ton basard "explain" j'ai encore jms vu ça de ma vie en SQL, ni sous access, ni sous sqlserver, ni sous oracle, ni sous mysql. Donc ça sort d'ou?
Marsh Posté le 20-10-2005 à 17:47:30
Pour info explain est une fonction propre a mysql:
http://dev.mysql.com/doc/refman/5.0/fr/explain.html
Pour le reste ta reponse ne m'apporte pas beaucoups de lumiere sur la suite
en fait ce message est surtout adressé à des personnes maitrisant les messages
retournes par le fonction explain de mysql
car grace à son retour on peut surement comprendre pourquoi ma requette est aussi lente.
Merci quand meme pour ta reponse meme si elle est un peu agressive à mon gout lol.
--
Ben younes Ousama
- Epitech 5eme annee
- Ingenieur developpement A2I (Alliance Internationale Informatique)
- Web: http://www.noofs.com
Marsh Posté le 20-10-2005 à 17:58:25
ah oui je vois ce que ça fais ce truc!
ben si je t'ai dis comment améliorer ta requète... Combien de record à tu dans tes tables afin que je me fasse une petit idée ?
Marsh Posté le 20-10-2005 à 12:48:57
Bonjour a tous,
la requete suivante est beaucoups trop longue à executer, alors que les champs necessaires sont tous indexes.
explain SELECT DISTINCTROW FilmNeutre.NoIntFN, FilmNeutre.NoMereGen, FilmNeutre.CodeMatiere, FilmNeutre.Laize, FilmNeutre.Epaisseur, FilmNeutre.NoDossier, Dossiers.CodeClient, Dossiers.CodeArticle, FilmNeutre.Machine, FilmNeutre.NoIntProprietaire, FilmNeutre.CodeAide, FilmNeutre.CodeCond, FilmNeutre.RebutTotal, FilmNeutre.PoidsRebut, FilmNeutre.TypeSortie, Dossiers.NoCmdClient, Dossiers.QuantPoids, Dossiers.QuantNbre, Dossiers.QuantSurf, Dossiers.QuantLong FROM Dossiers INNER JOIN FilmNeutre ON Dossiers.NoDossier = FilmNeutre.NoDossier LEFT JOIN LiensAmont ON FilmNeutre.NoIntFN = LiensAmont.NoAmont WHERE (((FilmNeutre.TypeSortie)=1 Or FilmNeutre.TypeSortie=6) AND ((LiensAmont.NoAmont) Is Null)) ORDER BY FilmNeutre.NoDossier, FilmNeutre.NoIntFN ;
Elle met 22 sec en moyenne a se lancer sous mysql et sous access(avec des donnees et une structure similaire) elle met moin de 5 sec.
Apres plusieurs heures de recherches je n'ai toujours pas su trouver d'ou cela pouvait bien provenir.
J'ai donc fait un explain de ma requete et le resultat est le suivant:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE Dossiers ALL PRIMARY NULL NULL NULL 22689 Using temporary; Using filesort
1 SIMPLE FilmNeutre ref NoDossier IX_9 11 stock.Dossiers.NoDossier 2 Using where
1 SIMPLE LiensAmont ref NoAmont NoAmont 5 stock.FilmNeutre.NoIntFN 2 Using where; Using index; Distinct
Ma question est la suivante: pour le champ Nodossier qui est une clef primaire, je ne dois pas faire d'index puisqu'une clef primaire
est automatiquement indexe (si je ne me trompe pas).
Or le resultat que me sort explain m'inquiete puisque dans les colones key, key_len et ref, les valeurs sont a NULL comme vous pouvez le voir.
Est ce normal que l'on ne voit pas le champ clef primaire apparaitre au lieu des valeurs NULL....
Cela expliquerait donc pkoi ma requette est si longue a s'executer...
pour que ceci soit corrige quelle conseil me donnez vous?
merci encore
--
Ben younes Ousama
- Epitech 5eme annee
- Ingenieur developpement A2I (Alliance Internationale Informatique)
- Web: http://www.noofs.com