Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Abfrage läuft nur langsam (https://www.delphipraxis.net/141710-sql-abfrage-laeuft-nur-langsam.html)

simmi 14. Okt 2009 15:06

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;

mkinzler 14. Okt 2009 15:08

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

franktron 14. Okt 2009 15:13

Re: SQL Abfrage läuft nur langsam
 
Hast du überhaupt einen Index auf dta_bezeichnung gesetzt

simmi 15. Okt 2009 07:13

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.

mkinzler 15. Okt 2009 07:16

Re: SQL Abfrage läuft nur langsam
 
Zitat:

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.
Und warum nicht? .Filter/.Filtered sind Eigenschaften von TDataSet von

Delphianer 15. Okt 2009 10:18

Re: SQL Abfrage läuft nur langsam
 
Hi,

dauert das Auslesen der Datensätze so lange oder das Anlegen der Radiogroup?

Gruß

Sir Rufo 15. Okt 2009 10:28

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:
SELECT * FROM foo WHERE foo1 LIKE :Abfragewert
Jetzt gibt es enen Parameter 'Abfragewert', den du entsprechend bestücken kannst.

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

Tyrolean 16. Okt 2009 08:54

Re: SQL Abfrage läuft nur langsam
 
Zitat:

Zitat von simmi
Wie kann dieser Vorgang beschleunigt werden????

Delphi-Quellcode:
procedure TForm1.RadioGroup2Click(Sender: TObject);
var bu : string;

begin
radioGroup1.Items.BeginUpdate; //NEU
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;
radioGroup1.Items.EndUpdate; //NEU

Vielleicht mit Begin/EndUpdate

Delphianer 16. Okt 2009 09:15

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

simmi 16. Okt 2009 18:49

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 22:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz