IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Boucle trop longue


Sujet :

ASP.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 45
    Points : 20
    Points
    20
    Par défaut Boucle trop longue
    Bonjour,
    Sur une page web j'ai un champs "Contact" qui permet à l'utilisateur de chercher une personne par son numéro de matricule.
    J'ai fait une boucle qui parcourt ligne par ligne toute ma table des personnes et elle ne s'arrête pas tant que ce qui a dans le champs "contact" n'est pas égal à une ligne dans la colonne PersonneNo.
    Lorsque le numéro de personne recherché est proche de 1 il n'y a pas de problème, cependant plus le numéro de personne recherché est grand plus le programme met de temps. J'ai plusieurs centaines de milliers de personnes dans ma base de données et au delà du numéro 100 le programme commence à mettre énormément de temps, alors je ne vous parle même pas de ce que ça donne si le numéro est très grand ou bien si pas égal à une valeur de la bdd, j'ai pas attendu assez longtemps pour savoir combien de temps ça pouvait mettre!

    En gros ma question c'est comment améliorer les performances de cette recherche et faire en sorte que peu importe le numéro recherché, le résultat soit vite trouvé?

    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    String requeteSQL = "SELECT MAX(personne_no) FROM UA1_PERSONNE";
                    SqlCommand oCommand = new SqlCommand(requeteSQL, oConnection2);
                    int max = (int)oCommand.ExecuteScalar();
                    int i = 0;
                    while (i < max+1)
                    {
                        IPersonne pers = personne.Lire(i);
                        if (pers != null)
                        {
                            if (Contact.Text.Equals(Convert.ToString(pers.PersonneNo)))
                            {
                                Response.Redirect("Contacts.aspx?PersonneNo=" + i);
                            }
                            else
                            {
                                i++;
                            }
                        }
                        else
                        {
                            i++;
                        }
                    }
                    LabelErreur.Text = "Ce numéro de personne n'existe pas";
    Merci d'avance

  2. #2
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Points : 3 102
    Points
    3 102
    Par défaut
    Citation Envoyé par Vivien57 Voir le message
    Bonjour,
    Sur une page web j'ai un champs "Contact" qui permet à l'utilisateur de chercher une personne par son numéro de matricule.
    J'ai fait une boucle qui parcourt ligne par ligne toute ma table des personnes et elle ne s'arrête pas tant que ce qui a dans le champs "contact" n'est pas égal à une ligne dans la colonne PersonneNo.
    Lorsque le numéro de personne recherché est proche de 1 il n'y a pas de problème, cependant plus le numéro de personne recherché est grand plus le programme met de temps. J'ai plusieurs centaines de milliers de personnes dans ma base de données et au delà du numéro 100 le programme commence à mettre énormément de temps, alors je ne vous parle même pas de ce que ça donne si le numéro est très grand ou bien si pas égal à une valeur de la bdd, j'ai pas attendu assez longtemps pour savoir combien de temps ça pouvait mettre!
    Ah bah ouais, tu m'étonnes...

    Tu ne procèdes pas de la bonne manière. Il faut que tu ailles chercher dans ta table la bonne ersonne, directement, en fonction d'un élément qui permet de l'identifier de façon certaine (id, NoPersonne, etc., cela dépend de la modélisation de ta table).

    Tu as en fait deux choix :
    - tu recherches la personne par son Id puis tu utilises une seconde requête pour instancier un objet Personne complet (IPersonne pers = personne.Lire(i); a priori dans ton cas)
    - tu ajoutes une méthode dans laquelle tu requête tous les champs nécessaires pour instancier un objet Personne complet en une seule requête.

    Quoi qu'il en soit, il te faut absolument changer de manière de procéder.

  3. #3
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Ouhlà. Tout simplement en laissant la DB faire la recherche à ta place avec une clause WHERE. D'une part la DB fera ça bien plus vite, ensuite elle ne retournera qu'une seule ligne (la bonne, moins de données à échanger), enfin tu pourras ajouter un index sur les matricules pour passer à une complexité O(log(N)).

  4. #4
    Membre expérimenté
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Points : 1 413
    Points
    1 413
    Par défaut
    +1 pour la clause where
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.

  5. #5
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Il faut toujours adapter la requete SQL pour qu'elle ne renvoie que les resultats voulus (en tout cas le minimum de resultats possible). Ce sera beaucoup plus efficace que de faire du filtrage dans le code. Et encore plus si un jour tu utilises un serveur pour la BDD différent de celui ou tourne l'application...

Discussions similaires

  1. Ameliorer code : Boucle trop longue
    Par diego45 dans le forum MATLAB
    Réponses: 3
    Dernier message: 05/12/2014, 10h55
  2. Réponses: 9
    Dernier message: 24/12/2007, 11h27
  3. [debutant] boucle trop longue?
    Par dolu02 dans le forum Langage
    Réponses: 3
    Dernier message: 30/04/2007, 16h17
  4. [TP]Probleme de ligne trop longue
    Par poppels dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 24/09/2004, 06h36
  5. chaine trop longue pour envoyer en socket?
    Par jeje.r dans le forum C++Builder
    Réponses: 10
    Dernier message: 27/06/2003, 16h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo