Requête lente

Fermé
FONGBE Messages postés 149 Date d'inscription samedi 5 novembre 2016 Statut Membre Dernière intervention 7 mars 2024 - 5 nov. 2016 à 18:35
yg_be Messages postés 23391 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 décembre 2024 - 20 déc. 2016 à 19:32
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 23391 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 décembre 2024 Ambassadeur 1 556
5 nov. 2016 à 18:46
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 23391 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 décembre 2024 Ambassadeur 1 556
6 nov. 2016 à 11:10
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 23391 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 décembre 2024 Ambassadeur 1 556
18 nov. 2016 à 19:45
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 23391 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 décembre 2024 1 556
20 déc. 2016 à 19:32
Merci de marquer comme résolu, bonsoir!
0
FONGBE Messages postés 149 Date d'inscription samedi 5 novembre 2016 Statut Membre Dernière intervention 7 mars 2024
5 nov. 2016 à 18:53
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
5 nov. 2016 à 23:15
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 23391 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 décembre 2024 1 556
5 nov. 2016 à 23:25
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 23391 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 décembre 2024
5 nov. 2016 à 23:36
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 149 Date d'inscription samedi 5 novembre 2016 Statut Membre Dernière intervention 7 mars 2024 > Utilisateur anonyme
6 nov. 2016 à 18:26
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 149 Date d'inscription samedi 5 novembre 2016 Statut Membre Dernière intervention 7 mars 2024
6 nov. 2016 à 19:17
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 149 Date d'inscription samedi 5 novembre 2016 Statut Membre Dernière intervention 7 mars 2024
7 nov. 2016 à 11:47
ok merci, je vais revoir la structure, il ya tout au plus 3 interro et un devoir.
0