C# schlechte Datenbank laufzeit

xlon

Mitglied
Hallo :)
ich habe folgende problem:

mein tool welches ich gerade programmiere, hat eine katastrophale laufzeit in der Datenbindung. ich habe ein datagrid und ein dazugehöriges dataset. dazu habe ich noch ein suchfeld gebaut. in dem dataset habe ich ca 3000 einträge (mit 500 oder sogar weniger habe ich das gleiche problem) wenn ich jetzt z.b. nach dem namen peter suchen würde, hätte ich mind. 5 sekunde wo das programm hängt. das liegt daran das ich nach jeden buchstaben das dataset neu laden muss. ich habe es dann mal probiert mit dem dataset zuarbeiten. so das ich einmal am anfang alle daten lade und dann darin dann nur noch die abfrage mache. das hat dann aber zur folge das meine daten nicht mehr aktuell sind, da auf die datenbank mehrere leute zugreifen und auch ändern können.

also muss ich irgendwie versuchen immer die aktuellen daten in einer angemessenden zeit zubekommen.

ich hoffe mir kann da jemand weiterhelfen
vielen dank im vorraus :)
 
Hi xlon,

welche Datenbank-System hast du denn? Das sind übertriebene Zeiten...

Als Optimierung kannst du z. B. einbauen, das die Suche erst ausgelöst wird, wenn 500 ms - 1 Sekunde (kannst ja machen wie du willst!) keine Eingabe gemacht wurde. Bei jedem Tastendruck ist das nicht wirklich sinnvoll, so schnell kann eh kein Mensch die Ergebnisse sehen...

Desweiteren kannst du ja mal gucken, ob es möglich ist, die Daten asynchron abzufragen/einzutragen d. h. die Daten die vom SQL-Server schon verarbeitet und zurückgeliefert werden sollen in das Dataset geschrieben und angezeigt werden die anderen werden nach und nach übermittelt und das dataset um diese erweitert. Damit wird dein Grid "wachsen", da die Daten im Hintergrund geladen werden und deine Anwendung nicht erst auf die gesamte Ergebnismenge warten muss.


Gruß
RudolfG
 
Hallo Rudolf,
ich habe einen ganz normalen sql server 2005, das sind beides sehr gute vorschläge. nur wie mache ich das? wie mache ich eine abfrage ob 1 sekunde nichts gedrückt wurde? und wie kann ich die daten im hintergrund laden lassen

vielen dank für deine schnelle antwort, ich hoffe du kannst mir noch weiterhelfen
 
mach ich es denn genrell richtig das ich mein dataset so fülle. und das dann bei jeder änderung ausführe?
Code:
einsatzuebersicht2DataSetTelNr = ((ServerState.Einsatzuebersicht2DataSetTelNr)(this.FindResource("einsatzuebersicht2DataSetTelNr")));
                    // Lädt Daten in Tabelle "AdminToolTelNr". Sie können diesen Code nach Bedarf ändern.
                    einsatzuebersicht2DataSetTelNrAdminToolTelNrTableAdapter = new ServerState.Einsatzuebersicht2DataSetTelNrTableAdapters.AdminToolTelNrTableAdapter();
                    einsatzuebersicht2DataSetTelNrAdminToolTelNrTableAdapter.FillBy1(einsatzuebersicht2DataSetTelNr.AdminToolTelNr, melder);
                    System.Windows.Data.CollectionViewSource adminToolTelNrViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("adminToolTelNrViewSource")));
                    adminToolTelNrViewSource.View.MoveCurrentToFirst();
 
Hallo Rudolf,
ich habe einen ganz normalen sql server 2005, das sind beides sehr gute vorschläge. nur wie mache ich das?

Hi xlon,

ganz normal ;-) Naja bei so wenig Datensätzen, hätte ich eher auf Access oder so getippt. Ich kann es aber nicht wissen, sonst meint einer Access, MySQL, Firebird und ein ganz andere den Oracle-Server :D

wie mache ich eine abfrage ob 1 sekunde nichts gedrückt wurde?

Also ich habe in meinem Projekt von dem Eingabefeld abgeleitet, da einen Timer als Member angelegt, beim ersten Event, dass sich die Eingabe im Eingabefeld geändert hat starte ich den Timer, beim Auslösen des Events das die Zeit im Timer abgelaufen ist, löse ich die erneute Datenbankabfrage aus und stoppe den Timer.

Bei jedem Event, dass sich die Eingabe geändert hat, wird intern überprüft ob der Timer schon läuft, wenn ja wird er neugestartet (das er von neu die Zeit abwartet) und wenn nicht wird er gestartet.

und wie kann ich die daten im hintergrund laden lassen

Wie es im Einzelnen das mit dem Dataset geht kann ich dir leider nicht sagen, da mit dem noch nie gearbeitet habe. Aber die grundsätzliche Herangehensweise sollte sein, dass die Daten in einem Thread also asynchron abgefragt werden und zwischendurch (sobald Daten da sind) den UI-Thread mit diesen Daten aktualisieren. Vielleicht können die anderen dir hier mehr helfen, ich komme nämlich nicht aus der .NET sondern aus der C++/Qt-Welt :D

vielen dank für deine schnelle antwort, ich hoffe du kannst mir noch weiterhelfen

Gern geschehen, ich hoffe meine Ansätze helfen entweder dir oder regen andere an sich mit Ideen/Vorschlägen zu beteiligen :D

Gruß
RudolfG
 
mir hast du auf jeden fall geholfen...zumindestens den richtigen denk anstoß gebracht, ich werde jetzt mal in diese richtung vorschen.

wenn jemand genaures schon weiß, kann er mir das gerne mitteilen.

viele grüße
 
Hallo,

Wie es im Einzelnen das mit dem Dataset geht kann ich dir leider nicht sagen, da mit dem noch nie gearbeitet habe. Aber die grundsätzliche Herangehensweise sollte sein, dass die Daten in einem Thread also asynchron abgefragt werden und zwischendurch (sobald Daten da sind) den UI-Thread mit diesen Daten aktualisieren. Vielleicht können die anderen dir hier mehr helfen, ich komme nämlich nicht aus der .NET sondern aus der C++/Qt-Welt


Ein DataSet kann man sich wie eine Datenbank vorstellen,

es können Tabellen (DataTable) hinein geladen, Beziehungen erstellt werden und man kann selects (querys) machen, wie bei einer normalen Datenbank.


hat eine katastrophale laufzeit in der Datenbindung


Die extreme Laufzeit liegt wohl daran, dass du mit DataGridView, DataSet u.s.w. arbeitest, das ist in meinen Augen nicht für das gedacht, was Du machen willst, stell dir mal eine Flughafen-Datenbank vor, die das bewältigen müsste...

Wenn du Effizienter werden willst, solltest Du z.B. nicht immer gleich die ganze Datenbank nachladen,
Trigger einbauen oder nicht die ineffizientesten Klassen im .Net-Framework benutzen :)


LG VScan
 
ja aber wie kann ich denn "nicht immer die ganze datebank nachladen" und trotzdem "aktuell" bleiben? ich habe gestern noch gelesen das ich ja nicht immer alle daten aus der datenbank (spalten eines datensatzes) laden muss, nur die dich ich brauch.

wie bekomm ich es denn so schnell wie möglich? welche .net klasse brauche? bzw. welche nutze ich jetzt? ich bentutze ja den stand immoment.

danke für deine antwort
 
Hi,

wie läuft das mit deiner Datenbank genau, kann sich da in jeder Tabelle der Datenbank was ändern?
Wenn nicht, diese tabellen ausschließen!

In diesem Sinne stellt sich mir auch die Frage wer sich 500 Datensätze auf einmal anschaut ^^

Muss da jeder User immer alles, auf dem aktuellen Stand angezeit bekommen? Wenn nein, nur das zeigen was interessant ist, in diesem Fall nur einen Datensatz aus der Datenbak holen, nicht die ganze Tabelle. Wenn nötig mit Transaktionen den Zugriff regeln bei der Datenbank.

Wenn du Deine Suchalgorythmen mit einer Datenbankabfrage machen kannst, tu das, denn eine Datenbank arbeitet effizienter als dein (oder mein XD) Programm.

MfG
 
Zuletzt bearbeitet von einem Moderator:
hallo,
die tabellen die ich lade, da kann sich jeder zeit etwas ändern.

also am besten wäre es wenn sich das datagrid nach und nach auffüllt. es sind in einer tabelle 3000 einträge. es dauert ja immer 5sekunden bis was kommt, dann ist aber auch direkt alles da. das muss ja nicht sondern halt immer noch und nach, aber ich weiß nicht wie das geht.

Wenn du Deine Suchalgorythmen mit einer Datenbankabfrage machen kannst, tu das, denn eine Datenbank arbeitet effizienter als dein (oder mein XD) Programm.

? versteh ich nicht.
 

Neue Beiträge

Zurück