Anzeigen von Datensätzen in .NET sehr langsam

29/09/2008 - 15:58 von Norbert Pürringer | Report spam
Hallo Leute,

ich hab ein kleines Testtool in C# geschrieben, welches mittels
ADO.NET Datensàtze aus einer beliebigen Datenbank (Access,
Oracle, ...) in einer DataGridView Komponente anzeigen soll.

Ein Testfall benutzt eine Tabelle aus einer Access-Datenbank bestehend
aus etwa 60.000 Datensàtzen. C# benötigte etwa 3 Sekunden, um die
Datensàtze in der Komponente anzuzeigen.

Dasselbe Tool habe ich nochmals erstellt, nur diesmal in der Sprache
Delphi. Hier wird ADO verwendet und ebenfalls eine DataGrid Komponente
zur Anzeige von Datensàtzen benutzt. Hier dauerte die Anzeige von
60.000 Datensàtzen lediglich 0,7 Sekunden.

Auch bei Oracle Daten war Delphi 2 bis 3x so schnell als .NET.

Den großen Performancegewinn hat Delphi bei der Art und Weise, wann
die Daten angezeigt werden. Es werden nàmlich nur jene Datensàtze aus
der Datenbank geholt, die gerade im sichtbaren Bereich des DataGrids
sind (dieses Verhalten wird von TDataSet abgekapselt). Delphi ist
somit stàndig in Verbindung mit der Datenbank, um bei Bedarf Daten
nachzuladen (also, wenn die Scrollleiste des DataGrids hin- und
herbewegt wird). C# kopiert hingegen alle Datensàtze in ein DataTable
Objekt und dann kommt es zur Anzeige. Zwar ist C# bei der Navigation
der Scrollleiste etwas performanter (und "animierter"), aber es wird
viel Zeit mit "unsichtbaren" Daten vergeudet.

Gibt es irgendwelche Möglichkeiten, in C# die Anzeige von vielen
vielen (!) Datensàtzen (> 50.000) zu beschleunigen?

Zur Zeit liegt folgender C# Code bei mir vor:

DataTable dt = conn.CreateDataTable("SELECT * FROM " + frmOpen.Table);
gridView.DataSource = dt;

conn ist eine Klasse von mir, die ADO.NET benutzt.

Gruß,
Norbert
 

Lesen sie die antworten

#1 Peter Götz
29/09/2008 - 16:34 | Warnen spam
Hallo Norbert,

ich hab ein kleines Testtool in C# geschrieben,
welches mittels ADO.NET Datensàtze aus einer
beliebigen Datenbank (Access, Oracle, ...) in
einer DataGridView Komponente anzeigen soll.

Ein Testfall benutzt eine Tabelle aus einer
Access-Datenbank bestehend aus etwa
60.000 Datensàtzen. C# benötigte etwa 3
Sekunden, um die Datensàtze in der
Komponente anzuzeigen.



Ohne zu wissen, wie gross die einzelnen
Datensàtze sind, sagt das wenig aus.

Dasselbe Tool habe ich nochmals erstellt, nur
diesmal in der Sprache Delphi. Hier wird ADO
verwendet und ebenfalls eine DataGrid Komponente
zur Anzeige von Datensàtzen benutzt. Hier dauerte
die Anzeige von 60.000 Datensàtzen lediglich 0,7
Sekunden.



Es macht natürlich einen spürbaren Unterschied,
ob nur eine geringe Menge an Datensàtzen, eben
die, welche gerade im Grid sichtbar sind, oder eine
ganze DB-Tabelle vom Server zum Client übertragen
werden.

Auch bei Oracle Daten war Delphi 2 bis 3x so schnell
als .NET.



Ich bin sicher, das ist ein Vergleich von Äpfeln mit
Birnen, sprich ein Vergleich zwischen Übertragungs-
zeiten für völlig unterschiedliche Datenmengen.

Den großen Performancegewinn hat Delphi bei der
Art und Weise, wann die Daten angezeigt werden.
Es werden nàmlich nur jene Datensàtze aus der
Datenbank geholt, die gerade im sichtbaren Bereich
des DataGrids sind (dieses Verhalten wird von
TDataSet abgekapselt). Delphi ist somit stàndig in
Verbindung mit der Datenbank, um bei Bedarf Daten


nachzuladen (also, wenn die Scrollleiste des DataGrids
hin- und herbewegt wird).



Genau diese Notwendigkeit einer stetigen Verbindung
zur Datenbank will man in .net in vielen Fàllen
vermeiden.

C# kopiert hingegen alle Datensàtze in ein DataTable
Objekt und dann kommt es zur Anzeige.



Das heisst, es wird ein einziges Mal auf die DB-Tabelle
zugegriffen und dann ist Ruhe sowohl beim Server als
auch auf dem LAN zwischen Server u. Client. Genau das
ist in vielen Fàllen durchaus gewollt.


Zwar ist C# bei der Navigation der Scrollleiste etwas
performanter (und "animierter"),



Natürlich, weil eben die Daten beim ersten und einzigen
DB-Zugriff in einem Stück vom Server zum Client
übertragen werden und dann eine Navigation im
Datenbestand nicht mehr von der vergleichsweise
niedrigen Übertragungsrate auf dem LAN oder
sonstigen Leitungsweg eingebremst wird.

aber es wird


viel Zeit mit "unsichtbaren" Daten vergeudet.

Anzeige von vielen
vielen (!) Datensàtzen (> 50.000) zu beschleunigen?



Schau Dir mal die Online-Hilfe zum VirtualMode des
DataGridView-Controls an. Dieser Modus ist für das
Anzeigen sehr grosser Datenmengen im DataGridView
vorgesehen.

Das DataGridView kann in drei verschiedenen Modi
betrieben werden:

1) ungebundener Modus
bevorzugt für statische, lokale Daten

2) gebundener Modus
bevorzugt für interaktiven Betrieb (schreiben, lesen)
mit einer Datenbank.

3) virtueller Modus
u.a. für grosse Datenmengen.

Mehr dazu in der OH unter

"Datenanzeigemode im DataGridView-Steuerelement
in Windows Forms"

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen