Est-il rien de plus rapide que SqlDataReader dans .NET?
J'ai besoin de charger une colonne de chaînes à partir de la table sur SqlServer dans un Tableau en mémoire à l'aide de C#.
Est-il un moyen plus rapide que de les ouvrir SqlDataReader et boucle à travers elle.
La Table est grande et que le temps est critique.
MODIFIER
Je suis en train de construire .dll et l'utiliser sur le serveur pour certaines opérations sur la base de données. Mais il est trop lente pour l'instant. Si c'est plus rapide que ce que j'ai à la refonte de la base de données. J'difficile il y a peut être une solution pour augmenter la vitesse truc.
- je ne le pense pas.
Vous devez vous connecter pour publier un commentaire.
Lecteur De Données
Sur l'accès le plus rapide, vous obtiendrez de SQL est avec le SqlDataReader.
Profil il
Ça vaut réellement le profilage où votre problème de performance. Généralement, lorsque vous pensez que le problème de performance, est avéré être tout à fait tort, après que vous avez profilé elle.
Cela pourrait être par exemple:
De profilage de chacun de ces éléments dans l'isolement pour vous donner une meilleure idée de l'endroit où votre goulet d'étranglement. Pour le profilage de votre code, il y a un l'excellent article de Microsoft
Cache
La chose à regarder pour améliorer les performances est de travailler sur la si vous avez besoin pour charger toutes les données à chaque fois. La liste (ou une partie) être mis en cache? Jetez un oeil à la nouvelle Système.Moment de l'exécution.La mise en cache espace de noms.
De réécriture T-SQL
Si vous êtes en train de faire purement opérations sur les données (comme votre question le suggère), vous pouvez réécrire votre code qui utilise les données pour être en T-SQL et s'exécutent en mode natif sur SQL. Cela a le potentiel d'être beaucoup plus rapide, que vous allez travailler avec les données directement et de ne pas les déplacer sur.
Si votre code a beaucoup de logique procédurale, vous pouvez essayer de mélanger T-SQL avec L'Intégration du CLR vous donnant les avantages des deux mondes.
Beaucoup cela vient de la complexité (ou plus nature procédurale) de votre logique.
Si tout le reste échoue
Si tous les domaines sont optimales (ou au plus près), et de votre conception est sans faute. Je ne serais même pas entrer dans la micro-optimisation, je venais de jeter le matériel à elle.
Ce matériel? Essayez le la fiabilité et analyseur de performances pour savoir où le col de la bouteille est. Le plus probable de la place pour le problème que vous décrivez disque dur ou RAM.
Si
SqlDataReader
n'est pas assez rapide, peut-être vous devriez stocker vos affaires ailleurs, comme un (en mémoire cache.Pas. Il est en fait non seulement le moyen le plus rapide - il est le SEUL (!) façon. Tous les autres mécanismes d'utiliser à l'INTERNE un DataReader de toute façon.
Je soupçonne que
SqlDataReader
est à peu près aussi bon que vous allez obtenir.SqlDataReader est le moyen le plus rapide. Assurez-vous d'utiliser les obtenir par ordinale méthodes plutôt que par le nom des colonnes. par exemple, GetString(1);
Aussi valable, c'est d'expérimenter avec MinPoolSize dans la chaîne de connexion de sorte qu'il y a toujours quelques connexions dans le pool.
Le SqlDataReader sera le moyen le plus rapide.
Optimiser l'utilisation de l'informatique, par l'aide de la méthode Getxxx , qui prend un nombre en paramètre.
Si elle n'est pas assez rapide, voir si vous pouvez modifier votre requête. Mettre une couverture d'index sur la colonne (s) que vous souhaitez récupérer. Ce faisant, Sql Server n'a qu'à lire l'index, et ne pas avoir à aller à la table directement à retrouver toutes les infos nécessaire.
Ce sujet de la transformation d'une colonne de lignes à une seule rangée de colonnes, et ayant une seule rangée de lire?
SqlDataReader
dispose d'une optimisation de la lecture d'une seule ligne (System.Data.CommandBehavior.SingleRow
argument deExecuteReader
), alors peut-être il peut améliorer la vitesse un peu.Je vois plusieurs avantages:
reader[0]
),reader
) à un autre, peut être plus rapide qu'une boucle sur les éléments et l'ajout d'un nouveau tableau.D'autre part, il a un inconvénient à force de base de données SQL pour faire plus de travail.
"Fournit un moyen de lecture d'un flux avant uniquement de lignes à partir d'une base de données SQL Server" C'est l'utilisation de SqlDataReader à partir de MSDN . La structure de Données derrière SqlDataReder seulement permettre la lecture à l'avant, il est optimisé pour la lecture de données dans une seule direction. À mon avis, je veux utiliser SqlDataReader que DataSet pour la simple lecture des données.
Vous avez 4 séries de frais généraux
- L'Accès Au Disque
- .net code (cpu)
- Code SQL server (cpu)
- Le temps de basculer entre le code managé et non managé (cpu)
Tout d'abord
assez rapide pour vous, si ce n'est la seule solution est de rendre le disque plus rapide. (Vous pouvez obtenir les données à partir de SQL Server plus rapide qu'il peut le lire)
Vous pourriez être en mesure de définir une fonction Sql Server en C#, puis exécutez la fonction sur la colonne; désolé, je ne sais pas comment le faire. Cela peut être plus rapide qu'un lecteur de données.
Si vous avez plus d'un CPU, et vous le savez une valeur au milieu de la table, vous pouvez essayer d'utiliser plus d'un thread.
Vous pouvez être en mesure d'écrire quelques TSQL qui combine toutes les chaînes de caractères en une chaîne unique à l'aide d'un séparateur de vous le savez est sûr. Diviser ensuite la chaîne de nouveau en C#. Cela permettra de réduire le nombre d'allers-retours entre les administrés et non administrés code.
Certains de surface des choses à considérer qui peuvent influer sur la vitesse (en plus d'un lecteur):
Juste au hasard pensées. Pas sûr de ce qui pourrait vous aider dans votre situation.
Si la réactivité est un problème de chargement d'un grand nombre de données, regardez en utilisant les méthodes asynchrones - BeginReader.
J'en utilise tout le temps pour le remplissage de grands éléments d'interface graphique en arrière-plan, tandis que l'application continue à être réactif.
Vous n'avez pas dit la taille exacte de ces données est, ou pourquoi vous chargez-le dans un tableau.
Souvent, pour de grandes quantités de données, vous voudrez peut-être laisser dans la base de données ou de laisser la base de données ne le levage lourd. Mais nous aurions besoin de savoir quel type de traitement que vous faites, qui est un besoin dans un tableau à la fois.