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

Développement SQL Server Discussion :

Latence entre application et SQl Server


Sujet :

Développement SQL Server

  1. #1
    Membre averti
    Homme Profil pro
    Responsable Qualité logicielle
    Inscrit en
    Janvier 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable Qualité logicielle
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2011
    Messages : 22
    Par défaut Latence entre application et SQl Server
    Bonjour,

    Je viens ici car cela fait plusieurs semaines que je suis confronter à un très gros problème lié à la lenteur de notre application.

    Je m'explique :
    Nous avons des clients qui veulent utiliser notre logiciel sur plusieurs site distants donc cela implique une ouverture de la BDD à l'extérieur (la dessus tout est OK).
    Le gros problème que l'on rencontre, c'est que l'application est très très lente lorsque le logiciel est ouvert à distance.

    Donc je viens vers vous, pour savoir quelle solution sera la mieux pour que cette lenteur soit moins importante.

    Pour infos : on a essayé le mode DataReader qui est très très lent, le mode DataTable qui est pareil puis ensuite avec un WCF même si on a réussit à gagner du temps cela reste encore trop long.

    Merci d'avance.

  2. #2
    Membre Expert

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Par défaut
    Vous n'aurez pas ici une solution à ce problème de lenteur.
    Par contre il y a des pistes à creuser.
    Avez-vous fait des tests de monter en charge avant la mise en prod de votre application ?

    Face à un problème de lenteur, il faut établir un plan d'action méthodique pour arriver à mettre la main sur la (les) causes de cette lenteur.
    Je vous propose donc de provoquer une conf entre les différents acteurs : développeurs - admin réseaux - support - utilisateurs -... pour essayer de comprendre/analyser/mettre en place un plan d'action

    du courage
    Etienne ZINZINDOHOUE
    Billets-Articles

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 002
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Falcomix Voir le message
    Pour infos : on a essayé le mode DataReader qui est très très lent, le mode DataTable qui est pareil puis ensuite avec un WCF même si on a réussit à gagner du temps cela reste encore trop long.
    Quand vous dites DataReader et DataTable vous voulez dire que vous faites des accès tables et non des requêtes SQL ???

    Parce que si tel est le cas ne vous étonnez pas des lenteurs. Une application client/serveur est conçu pour faire des requêtes SQL, pas des accès table !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Donnez votre exemple avec le DataReader.

    Quel fournisseur d'accès aux données utilisez vous? (ADO.net) à priori.

  5. #5
    Membre averti
    Homme Profil pro
    Responsable Qualité logicielle
    Inscrit en
    Janvier 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable Qualité logicielle
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2011
    Messages : 22
    Par défaut
    Citation Envoyé par zinzineti Voir le message
    Vous n'aurez pas ici une solution à ce problème de lenteur.
    Par contre il y a des pistes à creuser.
    Avez-vous fait des tests de monter en charge avant la mise en prod de votre application ?

    Face à un problème de lenteur, il faut établir un plan d'action méthodique pour arriver à mettre la main sur la (les) causes de cette lenteur.
    Je vous propose donc de provoquer une conf entre les différents acteurs : développeurs - admin réseaux - support - utilisateurs -... pour essayer de comprendre/analyser/mettre en place un plan d'action

    du courage
    Cela fait parti des tests de charges, on a réussi à gagner du temps suite à l'analyse d'un profiler car on a remarqué qu'un grand nombre de requêtes étaient inutile, ensuite nous avons testé sur différent réseau mais les proportions de latence reste de la même grandeur en fonction de la qualité des liaisons.
    Donc c'est pour cela que nous voulons savoir si cela ce fait réellement en production à savoir l'utilisation d'un client lourd avec une BDD SQL Server via internet ?

    Citation Envoyé par zinzineti Voir le message
    Quand vous dites DataReader et DataTable vous voulez dire que vous faites des accès tables et non des requêtes SQL ???
    Non, on utilise des procédures stockées pour la récupération des données en Base, par contre c'est le mode de communication qui est en DataReader (pour l'extraction des données) et le Datatable (permet de monté en mémoire sur le serveur et puis on transfère le Dataset au client)

  6. #6
    Membre averti
    Homme Profil pro
    Responsable Qualité logicielle
    Inscrit en
    Janvier 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable Qualité logicielle
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2011
    Messages : 22
    Par défaut
    Citation Envoyé par iberserk Voir le message
    Donnez votre exemple avec le DataReader.

    Quel fournisseur d'accès aux données utilisez vous? (ADO.net) à priori.
    On est bien sur du .NET, le Datareader nous permet d'avoir une communication plus performante quand tout est en local, mais par contre avec une liaison distance cela est lent car il faut une connexion continue avec la BDD

  7. #7
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Si vos requètes sont rapide en local et la latence/ performance du réseau est médiocre et que vous ne pouvez pas jouer sur ce levier alors il vous reste à être particulièrement vigilant sur:
    • Limiter le nombre de requète
    • Limiter le nombre de données retournées (clause SELECT et clause WHERE)

  8. #8
    Membre averti
    Homme Profil pro
    Responsable Qualité logicielle
    Inscrit en
    Janvier 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable Qualité logicielle
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2011
    Messages : 22
    Par défaut
    Citation Envoyé par iberserk Voir le message
    Si vos requètes sont rapide en local et la latence/ performance du réseau est médiocre et que vous ne pouvez pas jouer sur ce levier alors il vous reste à être particulièrement vigilant sur:
    • Limiter le nombre de requète
    • Limiter le nombre de données retournées (clause SELECT et clause WHERE)
    En effet on fait un nombre considérable de requête (Analyse du profiler), mais elles sont toutes nécessaires, une option qui peut être envisagé est de récupérer les données prioritaires puis ensuite récupérer les autres éléments dans des threads.

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 002
    Billets dans le blog
    6
    Par défaut
    En gros en utilisant cette technique du DATAreader, vous faites du EXCEL, pas du SQL !!!
    Vous téléchargez la table entière pour aller lire juste une ligne !
    Toute votre architecture est a revoir car elle est stupide.
    Soit vous ne faites pas de client serveur et traitez tout en local, soit vous voulez bénéficier de la puissance du client serveur et vous devez vous débarrasser de vous datareader et de vos approche "table" !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  10. #10
    Membre averti
    Homme Profil pro
    Responsable Qualité logicielle
    Inscrit en
    Janvier 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable Qualité logicielle
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2011
    Messages : 22
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    En gros en utilisant cette technique du DATAreader, vous faites du EXCEL, pas du SQL !!!
    Vous téléchargez la table entière pour aller lire juste une ligne !
    Toute votre architecture est a revoir car elle est stupide.
    Soit vous ne faites pas de client serveur et traitez tout en local, soit vous voulez bénéficier de la puissance du client serveur et vous devez vous débarrasser de vous datareader et de vos approche "table" !

    A +
    On ne télécharge pas la table, on utilise le .net avec DataReader C'est à dire que l'on fait une requête SQL et que l'on récupère le flux avec le DataReader, donc en rien on ne récupère trop de données, on récupère juste le résultat de la requête..

    Ensuite cela veut dire que l'on n'utilise plus de ADO .Net ?

  11. #11
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    SQLPro > Non, "DataReader", en .NET, permet de ligne le résultat d'une requête "ligne à ligne".
    Il est réputé plus lent que le mode "DataTable", qui fait la même chose, mais récupère l'ensemble du résultat d'un coup, puisqu'à chaque fetch de ligne il y a un allez-retour sur le réseau.

    J'apporte mon fagot sur le tas de bois :
    - Contrairement aux idées reçues, préférez DataReader plutôt que DataTable : en effet, si le volume d'information est conséquent, alors DataReader retourne la première ligne dès que le SGBD l'a trouvée. Et la transmission d'une unique ligne sur le réseau est plus rapide que d'un ResultSet entier !
    - Utilisez des lectures asynchrones : lisez les quelques premières lignes, et affichez-les avant de lire la suite, en tâche de fond. En effet, dans 99% des cas, l'utilisateur se concentre sur les premières lignes
    - Paginez les résultats et limitez le nombre de lignes (utilisation de SELECT TOP n) afin de limiter le volume de données qui transitent sur le réseau inutilement (une requête qui ramène 1000 lignes n'a aucune chance d'être analysée entièrement par l'utilisateur, qui ne lira que les quelques premières dizaines de lignes
    - Faites le maximum de traitements côté SGBD : complexifiez vos requêtes (jointures, sous-requêtes, aggrégats, etc.) pour limiter le nombre de requêtes à exécuter pour arriver au résultat final. Essayez aussi d'en faire le maximum dans des procédures stockées, vues, triggers.
    - Limitez au maximum le nombre de colonnes retournées : il n'est pas rare de trouver des select * ou autres select <mes 250 colonnes de ma table> alors qu'on n'utilise ensuite qu'un id et un libellé. Vous divisez juste par 10 la capacité de votre connexion réseau.

    Voilà, en vérifiant tout ça, vous devriez améliorer pas mal vos performances.
    Mais ne vous attendez pas à un miracle !

  12. #12
    Membre averti
    Homme Profil pro
    Responsable Qualité logicielle
    Inscrit en
    Janvier 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable Qualité logicielle
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2011
    Messages : 22
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    SQLPro > Non, "DataReader", en .NET, permet de ligne le résultat d'une requête "ligne à ligne".
    Il est réputé plus lent que le mode "DataTable", qui fait la même chose, mais récupère l'ensemble du résultat d'un coup, puisqu'à chaque fetch de ligne il y a un allez-retour sur le réseau.

    J'apporte mon fagot sur le tas de bois :
    - Contrairement aux idées reçues, préférez DataReader plutôt que DataTable : en effet, si le volume d'information est conséquent, alors DataReader retourne la première ligne dès que le SGBD l'a trouvée. Et la transmission d'une unique ligne sur le réseau est plus rapide que d'un ResultSet entier !
    - Utilisez des lectures asynchrones : lisez les quelques premières lignes, et affichez-les avant de lire la suite, en tâche de fond. En effet, dans 99% des cas, l'utilisateur se concentre sur les premières lignes
    - Paginez les résultats et limitez le nombre de lignes (utilisation de SELECT TOP n) afin de limiter le volume de données qui transitent sur le réseau inutilement (une requête qui ramène 1000 lignes n'a aucune chance d'être analysée entièrement par l'utilisateur, qui ne lira que les quelques premières dizaines de lignes
    - Faites le maximum de traitements côté SGBD : complexifiez vos requêtes (jointures, sous-requêtes, aggrégats, etc.) pour limiter le nombre de requêtes à exécuter pour arriver au résultat final. Essayez aussi d'en faire le maximum dans des procédures stockées, vues, triggers.
    - Limitez au maximum le nombre de colonnes retournées : il n'est pas rare de trouver des select * ou autres select <mes 250 colonnes de ma table> alors qu'on n'utilise ensuite qu'un id et un libellé. Vous divisez juste par 10 la capacité de votre connexion réseau.

    Voilà, en vérifiant tout ça, vous devriez améliorer pas mal vos performances.
    Mais ne vous attendez pas à un miracle !
    D'accord, on va retravailler sur l'ensemble de la base de données et les requête pour voir si jamais cela nous permet d'être un peu moins lent.

  13. #13
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    En gros en utilisant cette technique du DATAreader

    Euh?
    Non Frédéric... le dataReader est juste l'objet qui lit le résultat d'une requète dans ADO.Net.

    C'est juste l'objet stockant le résultat de la requète

    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SqlConnexion cnx=new Sqlconnection(chainedeconnexion);
    SqlCommand cmd=new SqlCommand("SELECT prenom FROM dbo.DBAS WHERE nom IN('BROUARD','SQLPRO')",cnx);
    cnx.Open();
     SqlDataReader dr = cmd.ExecuteReader();
    While (dr.Read())
    {
     MessageBox.Show (dr[0].ToString());-- Affichage des deux prénoms
    }
    dr.Close();
    cnx.Close();

  14. #14
    Membre averti
    Homme Profil pro
    Responsable Qualité logicielle
    Inscrit en
    Janvier 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable Qualité logicielle
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2011
    Messages : 22
    Par défaut
    Par contre, est ce que la partie WCF vous semble une bonne solutions pour la communication entre client et serveur ?

    Car à l'avenir cette partie WCF deviendra un serveur de synchro.

  15. #15
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 002
    Billets dans le blog
    6
    Par défaut
    Ha merde, je m'a gourrrrrrrré ! Il faut que je me recycle !!!! ;-)

    A +


    Citation Envoyé par iberserk Voir le message
    Euh?
    Non Frédéric... le dataReader est juste l'objet qui lit le résultat d'une requète dans ADO.Net.

    C'est juste l'objet stockant le résultat de la requète

    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SqlConnexion cnx=new Sqlconnection(chainedeconnexion);
    SqlCommand cmd=new SqlCommand("SELECT prenom FROM dbo.DBAS WHERE nom IN('BROUARD','SQLPRO')",cnx);
    cnx.Open();
     SqlDataReader dr = cmd.ExecuteReader();
    While (dr.Read())
    {
     MessageBox.Show (dr[0].ToString());-- Affichage des deux prénoms
    }
    dr.Close();
    cnx.Close();
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  16. #16
    Membre actif
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : R&D

    Informations forums :
    Inscription : Avril 2004
    Messages : 127
    Par défaut
    Falcomix,
    la méthode plus simple est la prise de traces puis voir le temps d’exécution des requêtes. Si le temps ne pose pas des pb, chercher la lenteur hors SGBD.

Discussions similaires

  1. controler le nombre d'installation d'une application [vb6,SQL Server]
    Par josémaria dans le forum Installation, Déploiement et Sécurité
    Réponses: 1
    Dernier message: 20/05/2007, 20h45
  2. Equivalence entre Oracle et Sql Server
    Par sfaxi dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 17/01/2007, 09h27
  3. Erreur de connexion entre VS2005 et sql server
    Par popachubby dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 13/12/2006, 23h31
  4. Equivalence SQL entre access et sql server
    Par liliprog dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 03/07/2006, 15h19
  5. Lien entre oracle et SQL Server 2000
    Par alpachico dans le forum Décisions SGBD
    Réponses: 14
    Dernier message: 15/06/2005, 14h14

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