![]() |
Datenbank: MySQL • Zugriff über: DBExpress
SQL Abfrage läuft nur langsam
Hallo,
ich muss aus einem Delphi Programm heraus (RAD Studio 2007) auf eine MySQL Datenbank zugreifen. Ich habe die Komponenten aus dem Register DBExpress genutzt. Die Verbindung kommt korrekt zustande. In der Tabelle befinden sich ca. 300 Datensätze. Ich wähle in der Radiogroup1 einen Buchstaben aus, der in einer SQL Anweisung eingefügt wird. Die SQL Anweisung liefert als Ergebnissmenge alle Berufe mit diesem Anfangsbuchstaben. (max. 30 Bezeichnungen) Diese werden in der Radiogroup2 dargestellt. Es dauert jedoch sehr lange bis die Daten ausgelesen werden. Wie kann dieser Vorgang beschleunigt werden????
Delphi-Quellcode:
procedure TForm1.RadioGroup2Click(Sender: TObject);
var bu : string; begin radiogroup1.Items.Clear; bu:=radiogroup2.Items[radiogroup2.ItemIndex]; DataModule1.SQLDataSet1.CommandText:= 'select `dta_bezeichnung` from `bts_berufe` where `dta_bezeichnung` LIKE'+chr(39)+bu+'%'+chr(39); DataModule1.SQLDataSet1.Open; with DataModule1 do begin while not SQLDataSet1.Eof do begin radiogroup1.Items.Add(SQLDataSet1.FieldByName('dta_bezeichnung').AsString); SQLDataSet1.Next; end; end; DataModule1.SQLDataSet1.Active:=false; end; |
Re: SQL Abfrage läuft nur langsam
Für diese Abfrage kann kein Filter verwendet werden. Abhilfe weiteres Feld mit Anfangsbuchstaben anlegen oder lokal filtern
|
Re: SQL Abfrage läuft nur langsam
Hast du überhaupt einen Index auf dta_bezeichnung gesetzt
|
Re: SQL Abfrage läuft nur langsam
Danke für eure Hinweise.
Also, wenn ich die Beschreibung der TSQLDataSet Komponente richtig verstanden habe, sendet diese die SQL Anweisung an den Server, dort wird die SQL Anweisung ausgeführt und die Komponente TSQLDataSet bekommt vom Server die Ergebnismenge zurückgeliefert. Diese hat nach der SQL Anweisung eine Größe unter einem KByte. Heißt, der Index ist eigentlich uninteressant, das die Datenbereitstellung vom Server übernommen wird. Dort dauert die SQL Anweisung weniger als ein Wimpern schlag. Filter setzen, in der Komponente, geht ja MySQL Datenbanken bzw. Tabellen sowieso nicht. Aus diesem Grund ja die SQL Anweisung, die den Server veranlasst die Datenmenge zu beschränken. |
Re: SQL Abfrage läuft nur langsam
Zitat:
|
Re: SQL Abfrage läuft nur langsam
Hi,
dauert das Auslesen der Datensätze so lange oder das Anlegen der Radiogroup? Gruß |
Re: SQL Abfrage läuft nur langsam
Nimm dem DataSet vor der Zuweisung des SQL-Statements mal die Connection weg.
Dann SQLCommandText zuweisen und dann die Connection wieder dranhängen. Das gibt schon eine Zeitersparnis ;) Ansonsten kannst du ja auch die Abfrage mit einem Parameter definieren
SQL-Code:
Jetzt gibt es enen Parameter 'Abfragewert', den du entsprechend bestücken kannst.
SELECT * FROM foo WHERE foo1 LIKE :Abfragewert
Auf deinem Weg wird bei der Zuweisung des SQLCommandText schon eine Verbindung zum SQL-Server aufgebaut und das SQL-Statement überprüft. Dann beim Open passiert das Gleiche nochmals. Mit diesem Weg sparst Du Dir diese Zeit. cu Oliver |
Re: SQL Abfrage läuft nur langsam
Zitat:
|
Re: SQL Abfrage läuft nur langsam
Ich komme nochmal auf meine Frage von gestern zurück.
Hast Du überhaupt schon mal getestet, was so lange dauert? In erster Linie, wie lange dauert DataModule1.SQLDataSet1.Open und wie lange dauert Deine while-Schleife. Solange man nicht weiß, wo das Programm trödelt, kann man doch auch nichts optimieren. Ansonsten schließe ich mich Tyrolean an, RadioGroup1.Items.BeginUpdate/RadioGroup1.Items.EndUpdate ist für mich ein heißer Kandidat. Lutz |
Re: SQL Abfrage läuft nur langsam
Danke für eure Antworten, die auch letztendlich zur Lösung geführt haben.
Also einmal zu Filtern. Bei einer MySQL Tabelle handelt es sich um eine unidirektionale Datenmenge, heißt die Filterfunktion löst einen Fehler aus. Deshalb ja die SQL Anweisung Select. Leider liegt das Problem bei der Komponente Radiogroup, diese benötigt für das Löschen der Items und der neuen Eintragung von Werten sehr viel Zeit. Die Komponente TSQLDataSet benötigt nur Sekundenbruchteile für die Ausführung der SQL Anweisung und dem Empfang der gewählten Datenmenge. Die Lösung lag im Austausch der Komponente. Ich nehme jetzt statt der Radiogroup eine Checklistbox, die ich jetzt einfach wie eine Radiogroup arbeiten lasse. Die Daten werden zumindest jetzt, schnell und zügig dargestellt. Danke für die Hilfe! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz