Laden...

Füllen einer List<> aus Datenbank nimmt viel Zeit in Anspruch

Erstellt von reloop vor 13 Jahren Letzter Beitrag vor 13 Jahren 4.666 Views
reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren
Füllen einer List<> aus Datenbank nimmt viel Zeit in Anspruch

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

F
10.010 Beiträge seit 2004
vor 13 Jahren
  1. Nur weil der debugger beim steppen anhält, heisst das nicht, das der codeselber auch langsam wäre.

  2. Wenn du einen DataReader benutzt, benutze nicht .tostring, sondern entweder einen cast oder reader.GetString(..)

reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren

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?

F
10.010 Beiträge seit 2004
vor 13 Jahren

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.

reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren

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?

2.298 Beiträge seit 2010
vor 13 Jahren

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 |

reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren

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?

F
10.010 Beiträge seit 2004
vor 13 Jahren

MySql ist übers netz wirklich langsam, im Verhältnis zu z.b. MSSql, PostGres oder Firebird.

731 Beiträge seit 2006
vor 13 Jahren

Ist auf der Tabelle die du befragst ein Index gesetzt?
MfG
wax

T
415 Beiträge seit 2007
vor 13 Jahren

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...

reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren

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));
L
416 Beiträge seit 2008
vor 13 Jahren

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.).

F
10.010 Beiträge seit 2004
vor 13 Jahren

@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 Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren

@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.

F
10.010 Beiträge seit 2004
vor 13 Jahren

Na dann ist die zeit ja auch klar, das wird auch nie schneller.

MySql ist übers netz nicht schneller.

reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren

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

X
1.177 Beiträge seit 2006
vor 13 Jahren

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.