Aidez moi à optimiser cette requete plize! - SQL/NoSQL - Programmation
Marsh Posté le 11-09-2005 à 02:04:38
Comme je dis toujours :
"Remplace ton IN par un EXISTS".
Le coup du "HAVING 0 = count (*) ..." je ne suis pas convaincu : le HAVING s'effectue lors du postprocessing, c'est à dire que c'est un filtre appliqué une fois la requête terminée, donc tu vas lire inutilement les lignes qui ne seront pas rammenée.
Sinon, là où tu pourras optimiser un maximum, c'est certainement sur les index : vérifie qu'ils sont "parfaits" pour ta requête (l'ensemble des champs des critères de filtre doivent participer à un index, pas un champ de moins ni de plus).
Et enfin, regarde si ton SGBD connait ce qu'on appelle les "query hints", qui te permettront de lui indiquer les meilleurs index en outrepassant les décisions de l'optimiseur.
Dans tous les cas, vérifie que tu n'as pas dans ton plan d'éxécution :
- RANGE SCAN
- TEMPORARY TABLE
- FULL SCAN (sauf si t'as un endroit où tu ne fais volontairement aucun filtre)
Marsh Posté le 11-09-2005 à 10:43:08
Je ne serai pas aussi catégorique, un FULL SCAN peut souvent être plus rapide qu'un passage par un index (exemple : quand on récupère une grosse partie d'une table).
Maintenant, c'est clairement la partie dans ton IN qu'il faudrait réécrire / simplifier.
Suivant ton SGBD, ça peut valoir le coup de mettre des sous-requêtes dans le FROM directement et de faire des jointures dessus, plutôt que des IN / EXISTS.
Marsh Posté le 13-09-2005 à 09:41:25
Salut,
Je voulais savoir si la requete à l'interieur de mon IN est executée àchaque fois ou bien une seule fois?
L'ensemble renvoyé étant statique et ne dépendant pas de la requete mère, ce serait trés dommage qu'elle soit executée à chaque fois , non?
Marsh Posté le 13-09-2005 à 09:47:32
Arjuna a écrit : Comme je dis toujours : |
----> Ce IN est il exexuter une fois ou plusieurs?
Arjuna a écrit : |
---->,Postprocessing,effectivement, c'est d'ailleurs pour ca que je l'utilise afin d'eviter de le relancer à chaque fois, sion tu propposes quoi? une sous requete?
Arjuna a écrit : |
---> Les Index tu les assigne pas uniquement pour les clés et les les jointures?
Arjuna a écrit : |
---->Pas sur que mysql le gere?
Arjuna a écrit : |
---->je connais la commande sous oracle et SQLServer mais pas Mysql, c'est quoi?
Marsh Posté le 13-09-2005 à 09:56:51
betsamee a écrit : pourquoi alors ne pas les mettre dans le from? |
C'est une excellent idée
J'y ai pensé au meme moment que toi ...
J'espere que CA LE FERA
Marsh Posté le 13-09-2005 à 11:25:46
perso pour un probleme quasi similaire ca l'a fait gravement pour moi
Marsh Posté le 13-09-2005 à 15:17:07
Code :
|
Salut voila le resultat, j'ai divisé par 10 le temps d'execution
merci à tous
Marsh Posté le 13-09-2005 à 15:19:13
pas la force d'analyser ton code , peux tu dire en gros comment tu t'y es pris , ca pourra toujours aider a l'occase
merci
Marsh Posté le 09-09-2005 à 15:31:03
Bonjour à tous,
Je suis en train de réaliser une requete assez conséquente et je suis arrivé au bout de mes compétences en terme d'optimisation, j'ai tout essayé : WHERE, HAVING , sous requetes imbriquées...:
Je suis comme meme passer de 5 minutes à 40 secondes puis à 15 secondes puis à 7 et ce sur un Bi Proc XEON...
Sachant que le client possede un pauvre athlon 1.3...je crains le pire...
Voila ma requete aidez moi (le MCD ne sera d'aucune utilité, c'est la syntaxe qui n'est pas optimale je pense...)
Message édité par PETOZAK le 09-09-2005 à 16:50:53