AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQL Abfrage läuft nur langsam
Thema durchsuchen
Ansicht
Themen-Optionen

SQL Abfrage läuft nur langsam

Ein Thema von simmi · begonnen am 14. Okt 2009 · letzter Beitrag vom 16. Okt 2009
Antwort Antwort
Benutzerbild von simmi
simmi

Registriert seit: 24. Nov 2004
Ort: Röbel/Müritz
112 Beiträge
 
Delphi XE5 Professional
 
#1

SQL Abfrage läuft nur langsam

  Alt 14. Okt 2009, 16:06
Datenbank: MySQL • Zugriff über: DBExpress
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;
Uwe
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: SQL Abfrage läuft nur langsam

  Alt 14. Okt 2009, 16:08
Für diese Abfrage kann kein Filter verwendet werden. Abhilfe weiteres Feld mit Anfangsbuchstaben anlegen oder lokal filtern
Markus Kinzler
  Mit Zitat antworten Zitat
franktron

Registriert seit: 11. Nov 2003
Ort: Oldenburg
1.446 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

Re: SQL Abfrage läuft nur langsam

  Alt 14. Okt 2009, 16:13
Hast du überhaupt einen Index auf dta_bezeichnung gesetzt
Frank
Tux sein Lieblingsquellcode
While anzfische<TuxSatt do begin
Fisch:=TFisch.Create; Tux.EssenFisch(Fisch); Fisch.Free;inc(anzfische); end;
  Mit Zitat antworten Zitat
Benutzerbild von simmi
simmi

Registriert seit: 24. Nov 2004
Ort: Röbel/Müritz
112 Beiträge
 
Delphi XE5 Professional
 
#4

Re: SQL Abfrage läuft nur langsam

  Alt 15. Okt 2009, 08:13
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.
Uwe
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: SQL Abfrage läuft nur langsam

  Alt 15. Okt 2009, 08:16
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
Markus Kinzler
  Mit Zitat antworten Zitat
Delphianer

Registriert seit: 19. Feb 2003
Ort: Rossau
149 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#6

Re: SQL Abfrage läuft nur langsam

  Alt 15. Okt 2009, 11:18
Hi,

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

Gruß
Lutz
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

Re: SQL Abfrage läuft nur langsam

  Alt 15. Okt 2009, 11:28
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
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Tyrolean

Registriert seit: 3. Jul 2003
76 Beiträge
 
Delphi 7 Professional
 
#8

Re: SQL Abfrage läuft nur langsam

  Alt 16. Okt 2009, 09:54
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
  Mit Zitat antworten Zitat
Delphianer

Registriert seit: 19. Feb 2003
Ort: Rossau
149 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#9

Re: SQL Abfrage läuft nur langsam

  Alt 16. Okt 2009, 10:15
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
  Mit Zitat antworten Zitat
Benutzerbild von simmi
simmi

Registriert seit: 24. Nov 2004
Ort: Röbel/Müritz
112 Beiträge
 
Delphi XE5 Professional
 
#10

Re: SQL Abfrage läuft nur langsam

  Alt 16. Okt 2009, 19:49
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!
Uwe
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:54 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