2009-08-10 5 views
0

J'utilise le lecteur de données SQl pour obtenir de la valeur à partir de la base de données SQL.Optimisation du lecteur de données SQL

Langue VB.NET

Après l'obtention de données dans le lecteur, je lance une boucle while

While reader.Read 

     If reader.HasRows() Then 

/* Proessing of data */ 

     End If 

    End While 

Je remarque que la boucle while prend beaucoup de temps pour traiter comme il y a beaucoup de lignes. Existe-t-il une meilleure façon de mettre en œuvre.

Veuillez ajouter un commentaire sur: Dois-je obtenir les données SQlDataReader dans des listes de choix, puis traiter les données à l'aide des listes de choix?

Algo:

While reader.read 

    /* Put data into Arraylists */ 

    End While 

    for(arraylist row count) 
    /*Process data*/ 
    end for 
+1

Il serait intéressant de savoir exactement ce que vous essayez d'atteindre dans la boucle while. –

+1

De combien de lignes disposez-vous? Quel type d'information est stocké dans les lignes? Quel type de traitement faites-vous à chaque élément de ligne? Mettre les éléments dans un 'ArrayList' (vous devriez aussi envisager d'utiliser des génériques au lieu de' ArrayList'), puis faire le traitement sur eux est garanti pour être plus lent. Y a-t-il une raison pour laquelle vous ne pouvez pas mettre en page les données que vous renvoyez? –

Répondre

1

Pourriez-vous placer la logique de la boucle dans la logique de base SET dans le TSQL? Par conséquent, au lieu de parcourir chaque ligne dans le code, demandez au SGBDR de l'exécuter dans TSQL. C'est pour cela que les SGBDR sont conçus et sont bons.

Dites-nous ce que vous faites dans la boucle et quel TSQL est utilisé pour générer l'ensemble de données.

1

Il est inutile de vérifier si le lecteur de données comporte des lignes à l'intérieur de la boucle. S'il n'y a pas de lignes, la méthode Read renvoie false pour ne pas entrer dans la boucle, et s'il existe des lignes, la méthode HasRows renvoie la valeur true même si vous avez lu toutes les lignes. Suppression il vous permettra d'économiser un peu petit peu de temps, mais à peine perceptible:

While reader.Read 

    /* Proessing of data */ 

End While 

Lire toutes les données dans une liste avant le traitement ne vous donnera pas une meilleure performance. Au contraire, vous utiliserez beaucoup de mémoire qui pourrait être mieux utilisé pour autre chose.

+1

+1 Vrai bien que cela ne soit pas mesurable – Andomar

0

Ne supposez pas que la lecture des données de la base de données prend beaucoup de temps.
Vous pouvez mesurer le temps écoulé dans un bloc de code VB comme:

startTime = Now 
.... 
stopTime = Now 
elapsedTime = stopTime.Subtract(startTime) 

Mesure d'abord, puis d'optimiser la chose qui prend vraiment le temps.

(post-scriptum si vous utilisez Studio Team, vous pouvez essayer le profileur intégré.)

+0

L'horloge système a une résolution vraiment faible, donc elle ne sera utilisable que si vous mesurez quelque chose au moins dans la plage de secondes. Pour mesurer la quantité de temps plus courte, vous pouvez utiliser la classe System.Diagnostics.Stopwatch. – Guffa

Questions connexes