Autor Beitrag
haschme
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57
Erhaltene Danke: 1



BeitragVerfasst: Do 30.09.21 09:58 
Hallo zusammen,

für ein Projekt in dem ich mit C# eine recht große SQL Tabelle einlesen und verarbeiten muss, habe ich mich für die Möglichkeit entschieden, das über den SQLDataReader zu machen. Es funktioniert an sich recht gut.
Leider trat vor kurzem das Problem auf, dass ein Kollege von mir auf die gleiche Datenbank zugreifen musste während mein Programm noch lief.
Der Kollege beschwerte sich, dass seine Abfrage extrem langsam wurde, während mein SQLDataReader noch lief.

Daher wollte ich mal nachfragen ob jemand sich auskennt oder eine gute Quelle hat die beschreibt, was genau der SQLDataReader macht.
Ich verwende ihn so, dass ich einen command erstelle und .ExecuteReader ausführe. Dann via while(reader.Read()) die Daten einlese.
Die Frage die ich mir nun stelle: Wird bei jeder .Read()-Ausführung eine Abfrage an die Datenbank geschickt? Oder wie kommt der Reader an den jeweiligen nächsten Datensatz ran?
Anders könnte ich mir die Performanceprobleme bei meinem Kollegen nicht erklären.

Viele Grüße!
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 30.09.21 12:28 
Ein call zum Server holt soviel Daten/Rows ab wie in die definierte Paketgröße (im Connectionstring oder an der SqlConnection siehe PacketSize) passt. Das sind standardmäßig scheinbar 8K.

Kann man ändern ist aber sehr unwahrscheinlich das die Anzahl Network Calls da das Problem sind.
Viel wahrscheinlich ist das ihr euch wegen der beteiligten Abfragen mit Table/Row Locks in die Quere kommt oder euer Server einfach unterdimensioniert ist.

Für diesen Beitrag haben gedankt: haschme
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Fr 08.10.21 15:47 
Zitat:
Dann via while(reader.Read()) die Daten einlese.

Du kannst auch mal probieren, in die Schleife ein await Task.Delay(100) einzubauen. Dadurch gibst du den Server eine Pause (für andere Abfragen) und reduzierst die Last, die von deinem Programm ausgeht.

Ich habe auch schon mal bei einem produktiven SQL Server alte Daten gelöscht (immer 20k Zeilen pro Transaktion aber ohne Pause) und die eigentlichen User haben sich innerhalb kürzester Zeit beschwert, dass es nicht mehr gut läuft.

Für diesen Beitrag haben gedankt: haschme