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 :

Comment améliorer les performances des pages qui interrogent la base de données?


Sujet :

ASP.NET

  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Points : 144
    Points
    144
    Par défaut Comment améliorer les performances des pages qui interrogent la base de données?
    Bonjour,

    J'ai un probleme de performance sur une grosse table d'environ 33 000 entrees. (ce n'est pas encore si gros que ca j'avoue)

    Je remplis un GridView via un ObjectDataSource qui passe par une BLL qui elle meme passe par une DAL qui appelle une procedure stockee.

    Lorsque je veux passer a la page 2 dans ma gridview, cela prend environ 6s pour que ca se rafraichisse... (j'ai observe ca depuis firebug)

    La taille de la Response HTTP renvoyee est d'environ 13Ko, j'ai fais expres de ne pas afficher tous les champs de ma table pour voir si ca allait plus vite en ayant que 3 champs dans mon tableau compare a la vingtaine de la table.

    Mais l'attente semble etre exactement le meme que si j'affiche plus de champs.

    Donc je me dis, ca vient pas de la taille du code HTML renvoyee pour remplacer le GridView mais donc de la base de donnees ? Lorsque j'execute ma procedure stockee dans Management Studio ca m'a pas l'air d'etre si long... enfin ce n'est peut etre pas comparable...

    J'avais voulu decouper en architecture 3-tiers, est-ce que ca peut etre la source de la lenteur aussi ? Ou ce n'est pas signifiant ?
    Est-ce que les 6s vous paraisse normal et donc pas ameliorable ?
    Ou alors etonnant et qu'il est possible d'apporter differentes ameliorations ? Si oui, comment ?

    Merci
    A+

  2. #2
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Points : 144
    Points
    144
    Par défaut
    Je me demande si j'utilise un "Select TOP x" ca reduit ma requete et ca va donc plus vite.

    Mais il faudrait que je redefinisse mon GridView pour reecrire le code pour gerer la pagination et les filtres c'est ca ? Vu que la pagination de base se basera sur ma requete du TOP, si c'est un TOP 100 et que je mets 10 par pages, j'aurais que 10 pages...
    Donc il faudrait que je reecrive le code de la pagination en prenant en compte le fait que je passe par un TOP x.

    C'est possible vous pensez ? Ou ca va etre casse tete ?

  3. #3
    Expert confirmé
    Avatar de Nicolas Esprit
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Février 2010
    Messages
    1 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 1 467
    Points : 4 066
    Points
    4 066
    Par défaut
    Bonjour,

    Ah la joie de traquer les problèmes de perfs .

    Déjà, utiliser Firebug pour visualiser le temps de chargement de la page : c'est bien. Ensuite, avant de vouloir tout changer, je te conseille d'utiliser des Timers, ou des points d'arrêts (notamment dans ta BLL) pour voir exactement quelle étape prend beaucoup de temps (chargement de la page, requête en base, construction de la collection d'objet avec les résultats de la requête, etc...).

    Une fois le problème cerné, on pourra mieux te guider pour améliorer cela.

  4. #4
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Salut,
    Citation Envoyé par Nicolas Esprit Voir le message
    je te conseille d'utiliser des Timers
    La Trace plutôt: http://johannblais.developpez.com/tu...amework/#LII-A

    Peut-être devrais-tu aussi aller sur le forum SQL pour voir si tes requêtes ne peuvent pas être optimisées. Essayes de passer aux requêtes compilées de LINQ.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  5. #5
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Points : 144
    Points
    144
    Par défaut
    Re

    Merci pour vos reponses. Pendant ce temps, je continuais a faire des recherches et alors en fait, apres differents tests et recherches sur internet, c'est bien le fait que mon ObjectDataSource rapatrie les 30 000 records qui fait que ca dure plusieurs secondes...

    Et donc d'apres ce que j'ai trouve, en effet il n'y a pas d'interet a rapatrier les 30 000 records dans l'ODS si au final le GridView n'en affiche que 10 par page... logique je dirais... (je ne comprends pas pourquoi ils n'ont pas prevu que la paginationprenne ca en charge par defaut d'ailleurs...) et donc il faut faire une requete qui renvoie que les 10 qu'on va vouloir afficher dans le GridView et la c'est comme si c'etait instantane...

    Par contre, vu que l'on veut toujours pouvoir avoir les liens vers les pages, il faut faire une requete un peu speciale et configurer le GridView de la sorte pour avoir un "Custom Paging" et que les liens de page fonctionnent.
    J'ai trouve differents liens sur internet qui expliquent tres bien comment faire, je peux les poster si on m'autorise ?


    Autrement, dans ma quete d'optimisation... j'aurais d'autres questions concernant les index, mais bon ca releve plus du forum SQL du coup...
    Enfin, je les pose quand meme, on verra bien:
    J'ai trouve dans la FAQ une requete pour connaître la qualité des index :
    http://sqlserver.developpez.com/faq/...on#Validation5

    Je l'ai execute mais je ne sais pas trop comment la lire... je n'arrive pas a voir a quelle table chaque ligne se rapporte... ??
    et du coup pour voir quels sont les index... leurs noms.. ?

    Merci
    A+

  6. #6
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Argh une question SQL sur le forum .Net...

    Pour voir, faudrait faire le test de passer ta requete SQLdans l'objet data source et ne pas passer par ta DAL.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  7. #7
    Expert confirmé
    Avatar de Nicolas Esprit
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Février 2010
    Messages
    1 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 1 467
    Points : 4 066
    Points
    4 066
    Par défaut
    Arf, normal qu'elle était lente ta page . C'est sur que si tu ramènes 30.000 enregistrement pour en afficher que 10...

    C'est pourquoi dans la SelectMethod, les paramètres maximumRows et startRowIndex sont là pour une bonne chose

    Mais sinon, concernant la pagination avec une ObjectDataSource, ou une SQLDataSource, ce ne sont pas les exemples qui manquent sur le net ou MSDN.

    [EDIT] Pour avoir des liens vers les différentes pages, rien de spécial à faire : il te faut juste spécifier la méthode SelectCountMethod qui te renvoie le count total (les 30.000) dans ton cas [/EDIT]

  8. #8
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 90
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par italiasky Voir le message
    Re

    Merci pour vos reponses. Pendant ce temps, je continuais a faire des recherches et alors en fait, apres differents tests et recherches sur internet, c'est bien le fait que mon ObjectDataSource rapatrie les 30 000 records qui fait que ca dure plusieurs secondes...

    Et donc d'apres ce que j'ai trouve, en effet il n'y a pas d'interet a rapatrier les 30 000 records dans l'ODS si au final le GridView n'en affiche que 10 par page... logique je dirais... (je ne comprends pas pourquoi ils n'ont pas prevu que la paginationprenne ca en charge par defaut d'ailleurs...) et donc il faut faire une requete qui renvoie que les 10 qu'on va vouloir afficher dans le GridView et la c'est comme si c'etait instantane...
    étrange car moi, mes gridviews affichent 10 lignes par défaut sur les 4000 lignes en moyenne retournées, et la pagination se fait très bien. Si je clique sur la page 2, ca me met la suite en refaisant un appel en base, et j'ai rien modifié de particulier. Par contre, si j'affiche les 4000 lignes en un bloc, ca met plus de temps.... donc quand il y a que 10 lignes, il m'a ramené que 10 lignes . . .

  9. #9
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Citation Envoyé par FraocH Voir le message
    donc quand il y a que 10 lignes, il m'a ramené que 10 lignes . . .
    Ca te ramène que 10 lignes côté html mais à chaque fois tu récupères tes 4000 lignes en base

  10. #10
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Points : 144
    Points
    144
    Par défaut
    Citation Envoyé par lutecefalco Voir le message
    Ca te ramène que 10 lignes côté html mais à chaque fois tu récupères tes 4000 lignes en base
    Exact, c'est ce que je n'avais pas compris avant... tant que je n'etais pas confronte a de grosses tables!

    Du coup sur mes petites tables de quelques milliers, ca allait mais quand j'ai du traiter une table de 30 000 c'est la que j'ai pris conscience de ce qui se passait et de l'interet du SelectCountMethod, maximumRows et startRowIndex etc...

    Je crois que je vais toujours faire comme ca maintenant, meme pour des plus petites tables, c'est beaucoup plus performant meme si ca demande un peu plus de boulot!!

    Au passage, je me demandais est-ce que c'est mieux de formatter les donnees dans la requete ou dans le gridView au moment du Bind ?
    Exemple:
    - j'ai des nombres du genre 0.4100, j'aimerais les formater en 0.41
    - j'ai des donnees avec X...X (YYY) et j'aimerais afficher que YYY... mais la est-ce que je peux utiliser des regex directement dans le select ?

    Merci
    A+

  11. #11
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 90
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par lutecefalco Voir le message
    Ca te ramène que 10 lignes côté html mais à chaque fois tu récupères tes 4000 lignes en base
    oui oui tout a fait d'accord

  12. #12
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 90
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par italiasky Voir le message
    Exact, c'est ce que je n'avais pas compris avant... tant que je n'etais pas confronte a de grosses tables!

    Du coup sur mes petites tables de quelques milliers, ca allait mais quand j'ai du traiter une table de 30 000 c'est la que j'ai pris conscience de ce qui se passait et de l'interet du SelectCountMethod, maximumRows et startRowIndex etc...

    Je crois que je vais toujours faire comme ca maintenant, meme pour des plus petites tables, c'est beaucoup plus performant meme si ca demande un peu plus de boulot!!

    Au passage, je me demandais est-ce que c'est mieux de formatter les donnees dans la requete ou dans le gridView au moment du Bind ?
    Exemple:
    - j'ai des nombres du genre 0.4100, j'aimerais les formater en 0.41
    - j'ai des donnees avec X...X (YYY) et j'aimerais afficher que YYY... mais la est-ce que je peux utiliser des regex directement dans le select ?

    Merci
    A+
    ouais bonne question, je me le demande aussi souvent.
    apres je dirais que ca depend des situations, une appli qui a peu de Html a traité mais qui requete souvent, ferait mieux de deleguer ca au code, une page riche en affichage avec des requetes simples peut le faire en base ....

    vous en pensez quoi ?

  13. #13
    Expert confirmé
    Avatar de Nicolas Esprit
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Février 2010
    Messages
    1 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 1 467
    Points : 4 066
    Points
    4 066
    Par défaut
    Pour le formatage, tu peux utiliser les FormatString par exemple.

  14. #14
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    Pour voir, faudrait faire le test de passer ta requete SQLdans l'objet data source et ne pas passer par ta DAL.
    Tu as essayé ça? A mon avis c'est juste parce que ta DAL n'accepte pas les paramètre de pagination. Ces paramètres sont à préciser sur la commande SQL. C'est natif sur les SqlDataSource. Utilises uniquement la SqlDataSource, parametre la pour la paginer avec 10 records et dis nous.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 15/10/2009, 10h08
  2. Comment améliorer les performances lors d'une redirection?
    Par Courgette17 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 04/03/2008, 09h54
  3. 4D : comment améliorer les performances ?
    Par Elriks dans le forum 4D
    Réponses: 10
    Dernier message: 05/10/2007, 11h21
  4. Réponses: 2
    Dernier message: 01/08/2006, 10h20

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