Requête lente

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

  1. Contributeur
    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?
    1. Contributeur
      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;
      1. Contributeur
        Si c'est résolu ou que tu n'es plus intéressé, peux-tu clôturer cette discussion?
        1. Contributeur
          Merci de marquer comme résolu, bonsoir!
      2. Merci à vous je vais essayer cela. je vous fais un retour dès que possible.
        1. 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. Contributeur
            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.
          2. @yg_beDonc, aucun intérêt, pas besoin d'une fonction pour cela...

            Donc, FONGBE, donnes nous les détails.

            A+
          3. @Utilisateur anonymevoici 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.
          4. @FONGBEBonjour,

            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+
          5. ok merci, je vais revoir la structure, il ya tout au plus 3 interro et un devoir.