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 :
c) J'établis un left join (sur le code projet) entre ma sous-requête 1 et ma sous-requête 2.
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
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
Partager