
Envoyé par
StringBuilder
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 !
Partager