Optimiser requête

cs_Tipo Messages postés 82 Date d'inscription dimanche 2 novembre 2003 Statut Membre Dernière intervention 13 avril 2017 - 4 avril 2005 à 11:34
cs_Tipo Messages postés 82 Date d'inscription dimanche 2 novembre 2003 Statut Membre Dernière intervention 13 avril 2017 - 8 avril 2005 à 13:02
Bonjour,

j'ai besoin de sélectionner dans une table de relevés, les enregistrements pour lesquels la date est la plus récente, et seulement si un abonnement est actif. J'ai donc écrit ceci :

SELECT id_releve,releves.id_abonnement,releves.id_compteur,souscriptions.ref_abonne,
abonnes.nom_abonne,releves.date_releve,releves.index_releve,releves.nouv_index,
releves.nouv_date
FROM releves INNER JOIN (souscriptions INNER JOIN abonnes ON souscriptions.ref_abonne=abonnes.ref_abonne) ON souscriptions.ref_abonnement=releves.id_abonnement
WHERE date_releve=(SELECT MAX(date_releve) FROM releves WHERE releves.id_abonnement=souscriptions.ref_abonnement)
AND souscriptions.date_fin is null ORDER BY 1;

Le problème est que ma table de relevés contient + de 6000 enregistrements et qu'il faut plus de 30 secondes pour exécuter la requête (sur un P4-3Ghz)

Quelqu'un connaitrait-il un moyen d'optimiser ce code ? Merci d'avance pour vos idées...

2 réponses

cs_Ma2004 Messages postés 150 Date d'inscription mardi 20 juillet 2004 Statut Membre Dernière intervention 22 octobre 2008
7 avril 2005 à 11:04
Bonjour,

Quelles sont les tables ?

Ca ne marche pas:
"select * from releves where abonne=actif order by date_releve desk" ?

abonne=actif c'est évidemment simpliciste, c'est seulement là que la clause d'activité de l'abonné doit être mise.

A mon avis, ce n'est pas une réponse qui va t'aider. Donne nous les champs de tes tables, on pourra peut être proposer de meilleures réponses. . .
0
cs_Tipo Messages postés 82 Date d'inscription dimanche 2 novembre 2003 Statut Membre Dernière intervention 13 avril 2017 1
8 avril 2005 à 13:02
Bonjour,

Merci pour ta réponse mais j'ai déjà résolu le problème, avec comme tu le proposes, l'ajout d'un champ booléen qui indique le dernier relevé.
J'ai donc exécuté une seule fois la longue requête en faisant un update sur le booléen.
C'est effectivement tellement simple que je n'y avais pas pensé...

Maintenant ça fonctionne parfaitement !

Merci et bonne prog!
0
Rejoignez-nous