Requête lente

FONGBE Messages postés 147 Date d'inscription   Statut Membre Dernière intervention   -  
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   -
ma requête devient très lente quand j'insère la fonction RANG. quand le supprime la fonction rang? alors la requête s'exécute rapidement. la requête est créée à partir de deux tables: table ETUDIANT et Table COMPOSER. le champ moyenne est dans la table COMPOSER et les champs année scolaire et classe sont dans la table ETUDIANT. Dans la formule du RANG, les champs moyenne, classe et année scolaire interviennent. ça marche mais la requête devient très lente. merci de m'apporter de l'aide.

5 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
Je suppose que tu fais un JOIN entre les tables ETUDIANT et COMPOSER, et que, dans la même requête, tu fais appel à ta fonction RANG.
Peux-tu essayer de faire deux requêtes, la première sans la fonction RANG, et ensuite une seconde requête, utilisant la première comme source, avec la fonction RANG?
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
Que fait la fonction RANG? Elle est peut-être très lente en elle même.
Je suggère, pour améliorer les performances, de créer une table RESULTATS à partir de la requête à partir de ETUDIANT et COMPOSER.
Cette table peut-être temporaire, elle peut être vidée quand les RANGs ont été calculés.
Ta fonction RANG pourrait utiliser cette table RESULTATS pour calculer les rangs rapidement (je me demande comment tu les calcules pour le moment).
Ou bien tu peux calculer les RANGs ainsi (je suppose que la table RESULTATS contient matricule, moyenne, annee, classe):
SELECT R1.matricule, Count(R2.matricule)+1 AS RANG
FROM RESULTATS AS R1 
LEFT JOIN resultats AS R2 
ON ((R2.moyenne)<[R1].[moyenne]) AND ((R1.annee)=[R2].[annee]) AND ((R1.classe)=[R2].[classe])
GROUP BY R1.matricule;


Voici une requête qui visualise (un peu mieux) comment le RANG est calculé:
SELECT  R1.classe, R1.annee, R1.matricule,R1.moyenne,R2.matricule, R2.moyenne
FROM RESULTATS AS R1 
LEFT JOIN resultats AS R2 
ON ((R2.moyenne)<[R1].[moyenne]) AND ((R1.annee)=[R2].[annee]) AND ((R1.classe)=[R2].[classe])
ORDER BY R1.classe, R1.annee, R1.moyenne,R1.matricule, R2.moyenne,R2.matricule;
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
Si c'est résolu ou que tu n'es plus intéressé, peux-tu clôturer cette discussion?
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
Merci de marquer comme résolu, bonsoir!
0
FONGBE Messages postés 147 Date d'inscription   Statut Membre Dernière intervention  
 
Merci à vous je vais essayer cela. je vous fais un retour dès que possible.
-1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
 
Bonjour,

j'ai un peu de mal là.

Le champ moyenne est où ? Dans la table COMPOSER ou dans la requête RANG ?

Peux tu mettre *tous les champs* des tables concernées et des requêtes ?

A+

-1
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
Je pense que RANG est une fonction, une fonction VBA utilisée dans la requête.
La requête contient quelque chose comme "RANG(moyenne, classe, année)".
Et la fonction VBA RANG retourne, à chaque appel, une valeur, utilisée par la requête.
0
Utilisateur anonyme > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Donc, aucun intérêt, pas besoin d'une fonction pour cela...

Donc, FONGBE, donnes nous les détails.

A+
0
FONGBE Messages postés 147 Date d'inscription   Statut Membre Dernière intervention   > Utilisateur anonyme
 
voici les tables: T-ETUDIANT( Matricule etud, nom et prénoms, date de naiss,sexe,année scolaire, # Refclasse)
T-COMPOSER( refcompo, Interro1, interro2,interro3, moy interro, devoir commun, moyenne semestre,Rang,#matricule etud, Refmatière)
Nb: les interro sont noté sur 20 tandis que le devoir est noté sur 40, donc la moyenne des interro plus le devoir commun donne la moyenne du semestre.
j'ai créée d'abord à partir de la T-COMPOSER une requête analyse croisée pour afficher les matières en colonne et calculer la moyenne du semestre. cette requête analyse croisée qui calcule la moyenne du semestre et afficher les notes des matières est appelée PERIODE. la requête PERIODE avec la T-ETUDIANT donne la requête PERIODE1. C'est dans cette requête PERIODE1 que j'ai insérée la fonction RANG. C'est cette requête PERIODE1 qui est très lourde quand je la lance. merci beaucoup à vous.
0
Utilisateur anonyme > FONGBE Messages postés 147 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour,

on ne stocke pas de calcul dans une table...

Il y a forcément 3 interros ? Le jour où il y en a 4, tu es obligé de changer la structure de la table !

Donc, perso, je te conseille déjà de revoir la structure de ta base.

Si tu as besoin de conseils, n'hésites pas.

A+
0
FONGBE Messages postés 147 Date d'inscription   Statut Membre Dernière intervention  
 
ok merci, je vais revoir la structure, il ya tout au plus 3 interro et un devoir.
0