Hallo liebe Community,
ich mach es kurz und knackig:
Ich habe eine klasse "myClass".
Diese hat insgesamt 15 Eigenschaft. ( 3 Davon sind List<..class..> - falls das eine Rolle spielt?)
Nun, wenn ich nun im Code schreibe:
var newItem = new myClass();
dauert dieser Vorgang schon ca. 1 Sekunde. Es läuft zumindest im Debug nicht fließend weiter, sondern "hängt" kurz. Meiner interpretation nach zu lange. (Wenn ich das ganze mal auf 500 Summieren würde)
Nun gehe ich folgenden Weg:
Über einen DbDataReader lese ich mir die Daten aus einer Tabelle und laufe diese in einer while(myDbReader.read()) durch.
In dieser Whileschleife mache ich dann folgendes:
myList<myClass>.Add(new myClass {
properties = myDbReader['wert'].ToString(),
properties1 = myDbReader['wert'].ToString(),
properties2 = myDbReader['wert'].ToString(),
} usw.
Das ganze nimmt erheblich viel Zeit in anspruch. Woran kann das liegen? Ist mein Weg falsch gewählt? Gibt es evtl. eine elegantere Lösung?
Falls die Infos noch zu schwammig sind, oder Informationen fehlen, einfach mitteilen.
Vielen Dank,
reloop
Nur weil der debugger beim steppen anhält, heisst das nicht, das der codeselber auch langsam wäre.
Wenn du einen DataReader benutzt, benutze nicht .tostring, sondern entweder einen cast oder reader.GetString(..)
Er benötigt für das Füllen der Liste, bei einer Tabelle die 5 Datensätze und 10 Spalten hat, ca. 3-4 Sekunden.
Irgendwas kann da doch nicht stimmen?
Dann machst du dawa sfalsch.
Wie sieht der code richtig aus?
Welche DB?
Übrigens es gibt haufenweise fertige ORMapper, das musst du nicht selber nachbauen.
Greife auf eine MySQL Datenbank zu.. die mir in diesem Zuge fast als der Übeltäter erscheint.
Wenn ich selbige Prozeduren oben durch Textdateien füllen lasse, dauert es keine Sekunde.
Ist es bekannt das MySQL langsam(er) arbeitet?
Während IDataReader.Read() sind die Daten schon abgerufen...
Soll heißen, dass der DataReader nicht jede Zeile einzeln abholt.
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |
Danke, für die Hinweis.
Nach erneutem nachsehen erscheint mir das Problem des Zeitaufwandes bei der Select anweisung zuseien.
Hat jemand erfahrung mit MySQL und langsamen Zugriffen bzw. Antworten?
MySql ist übers netz wirklich langsam, im Verhältnis zu z.b. MSSql, PostGres oder Firebird.
Ist auf der Tabelle die du befragst ein Index gesetzt?
MfG
wax
Wie lautet denn deine Query? Machst du ne komplizierte Abfrage auf verschiedene Tabellen mit Unterabfragen? So eine Query könnte unter Umständen länger dauern...
Ist auf der Tabelle die du befragst ein Index gesetzt?
MfG
wax
Ja, muss ich den während eines Statements oder vorher irgendwie setzen bzw. beachten?
Wie lautet denn deine Query? Machst du ne komplizierte Abfrage auf verschiedene Tabellen mit Unterabfragen? So eine Query könnte unter Umständen länger dauern...
var result = _server.Get(String.Format(@"SELECT * FROM
tabelle WHERE col1 = '{0}' AND col2 = '{1}'",
value1,value2));
Den Index setzt du einmal und der hat dann erst mal nichts mehr mit den Statements zu tun.
Wie inflames2k schon schrieb sind die Daten nach beim Read schon von der DB abgerufen. Schau doch einfach mal wo genau die Zeit draufgeht (Stopwatch etc.).
@reloop :
[Artikelserie] Parameter von SQL Befehlen
Und vorsorglich
[Artikel] Ressourcen schonen - Datenbanken richtig öffnen und schließen
Muss man dir eigentlich alles aus der Nase ziehen?
Was mach server.get?
Ist es ein localer MySql?
Bitte versuche es uns so einfach zu möglich zu machen, dann bekommst du auch schnell eine Antwort.
@reloop :
Muss man dir eigentlich alles aus der Nase ziehen?
Nein, entschuldige, das war nicht meine Absicht.
Also:
_server.Get():
public DbDataReader Get(string query)
{
try
{
MySqlDataReader resultSet;
var CN = new MySqlConnection("CONNECTIONSTRING");
var command = CN.CreateCommand();
CN.Open();
command.CommandText = query;
resultSet = command.ExecuteReader();
return resultSet;
}
catch (Exception e)
{
throw e;
}
}
Der Server ist nicht local. Er liegt auf einem 1&1 Root Server.
Na dann ist die zeit ja auch klar, das wird auch nie schneller.
MySql ist übers netz nicht schneller.
Danke, FZelle.
Über local läuft es wirklich gravierend schneller. Werde wohl in den sauren Apfel beissen müssen und es darüber steuern.
Nochmals danke für deine Geduld.
Gruss,
reloop
huhu,
Er liegt auf einem 1&1 Root Server.
Es ist also nicht das LAN sondern eine Verbindung zu einem Server im Internet. Das machts dann nochmal langsamer (geringere Bandbreite, langer Weg). Da bekommt man imho mit jeder DB ein Problem.
😃
Xynratron
Herr, schmeiss Hirn vom Himmel - Autsch!
Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.