Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Füllen einer List<> aus Datenbank nimmt viel Zeit in Anspruch
reloop
myCSharp.de - Member

Avatar #avatar-3256.jpg


Dabei seit:
Beiträge: 139

Themenstarter:

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

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 9.993

beantworten | zitieren | melden

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(..)
private Nachricht | Beiträge des Benutzers
reloop
myCSharp.de - Member

Avatar #avatar-3256.jpg


Dabei seit:
Beiträge: 139

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 9.993

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von FZelle am .
private Nachricht | Beiträge des Benutzers
reloop
myCSharp.de - Member

Avatar #avatar-3256.jpg


Dabei seit:
Beiträge: 139

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
inflames2k
myCSharp.de - Experte

Avatar #AARsmmPEUMee0tQa2JoB.png


Dabei seit:
Beiträge: 2.296

beantworten | zitieren | melden

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 | Spielkartenbibliothek
private Nachricht | Beiträge des Benutzers
reloop
myCSharp.de - Member

Avatar #avatar-3256.jpg


Dabei seit:
Beiträge: 139

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 9.993

beantworten | zitieren | melden

MySql ist übers netz wirklich langsam, im Verhältnis zu z.b. MSSql, PostGres oder Firebird.
private Nachricht | Beiträge des Benutzers
Wax
myCSharp.de - Member

Avatar #avatar-2276.jpg


Dabei seit:
Beiträge: 730
Herkunft: Dortmund

beantworten | zitieren | melden

Ist auf der Tabelle die du befragst ein Index gesetzt?
MfG
wax
private Nachricht | Beiträge des Benutzers
t2t
myCSharp.de - Member



Dabei seit:
Beiträge: 415
Herkunft: Hamburg

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
reloop
myCSharp.de - Member

Avatar #avatar-3256.jpg


Dabei seit:
Beiträge: 139

Themenstarter:

beantworten | zitieren | melden

Zitat von Wax
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?
Zitat von t2t
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));
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von reloop am .
private Nachricht | Beiträge des Benutzers
Lennart
myCSharp.de - Member



Dabei seit:
Beiträge: 416
Herkunft: Bawü

beantworten | zitieren | melden

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.).
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 9.993

beantworten | zitieren | melden

@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.
private Nachricht | Beiträge des Benutzers
reloop
myCSharp.de - Member

Avatar #avatar-3256.jpg


Dabei seit:
Beiträge: 139

Themenstarter:

beantworten | zitieren | melden

Zitat von FZelle
@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.
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 9.993

beantworten | zitieren | melden

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

MySql ist übers netz nicht schneller.
private Nachricht | Beiträge des Benutzers
reloop
myCSharp.de - Member

Avatar #avatar-3256.jpg


Dabei seit:
Beiträge: 139

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Xynratron
myCSharp.de - Member



Dabei seit:
Beiträge: 1.177

beantworten | zitieren | melden

huhu,
Zitat von reloop
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!
Zitat von herbivore
Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.
private Nachricht | Beiträge des Benutzers