Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Optimierung von Abfrage (https://www.delphipraxis.net/36545-optimierung-von-abfrage.html)

Klarabella 21. Dez 2004 15:23


Optimierung von Abfrage
 
Hallo Leute!

Ich weiß, es gibt zu diesem Thema einiges bei der Suche, aber ich habe mir schon einiges zu Herzen genommen und es geht immer noch nicht fixer...

Also, ich habe ein Progrämmchen, dass eine Abfrage aus einer Datenbank erstellt.

Zunächst werden von meinem Programm aus zwei Views auf die Datenbank erstellt. Dies geht recht schnell.

Anschließend werden alle benötigten Daten in einem bestimmten Zeitraum in ein Grid geladen. Das sind dann im Test etwa 40 Datensätze.

Beim Start des Programms wird der Benutzer nach einer weiteren Einschränkung gefragt, die bisher nicht berücksichtigt ist.
Die Datensätze im Grid werden nun noch einmal durchlaufen und auf die gegebene Einschränkung überprüft.

Alle Datensätze, die positiv geprüft wurden, werden dann in ein StringGrid übernommen, dass sichtbar auf dem Formular ist. Wenn dieses am Ende angezeigt wird, dann sind daher alle Einschränkungen enthalten.

Ich habe den Weg der zweifachen Übergabe deswegen gewählt, weil der Benutzer seine Einschränkung im geladenen Formular noch ändern kann. In diesem Fall muss nicht noch einmal komplett aus der Datenbank geladen werden, sondern es reicht ein Blick auf das im Hintergrund befindliche StringGrid.

Hier mal ein bisschen Code zum besseren Verständnis:
Das Laden aus der Datenbank:
Delphi-Quellcode:
 sqlBefehl1 := 'SELECT * FROM Garantie_View WHERE (ablaufdatum BETWEEN ' +
             ':startdatum AND :enddatum)';
  sqlBefehl2 := 'SELECT * FROM Garantie_View WHERE (bf_pov_feld_5 BETWEEN ' +
             ':startdatum AND :enddatum)';
  sqlBefehl3 := 'SELECT * FROM Garantie_View2 WHERE (bf_pov_feld_5 BETWEEN ' +
             ':startdatum AND :enddatum)';

  rowZaehler := 0;

  FillGrid(sqlBefehl1, rowZaehler, true);
  FillGrid(sqlBefehl2, rowZaehler, true);
  FillGrid(sqlBefehl3, rowZaehler, false);
Und die Zuweisung der Parameter in der Procedure FillGrid:
Delphi-Quellcode:
qryDatenbank.SQL.Text := sql;

  // Parsen des Statements um Query Parameter zu finden
  qryDatenbank.Prepared := true;

  //start_datum entspricht dem aktuellen Datum
  qryDatenbank.ParamByName('startdatum').DataType := ftDate;
  qryDatenbank.ParamByName('startdatum').Value := Date;
  qryDatenbank.ParamByName('enddatum').DataType := ftDate;
  qryDatenbank.ParamByName('enddatum').Value := m_end_Datum;
...und hier die Übernahme vom ersten StringGrid (sgGarantie) in das zweite (sgGarantie_Daten):
Delphi-Quellcode:
rowC := 1;
  if (m_verkaeufer = 'Alle') then
    for i := 0 to sgGarantie.RowCount - 1 do
    begin
      sgGarantie_Daten.Rows[rowC] := sgGarantie.Rows[i];
      rowC := rowC + 1;
      sgGarantie_Daten.RowCount := rowC;
    end
  else
    for i := 0 to sgGarantie.RowCount - 1 do
      if (sgGarantie.Cells[7,i] = m_verkaeufer) then
      begin
        sgGarantie_Daten.Rows[rowC] := sgGarantie.Rows[i];
        rowC := rowC + 1;
        sgGarantie_Daten.RowCount := rowC;
      end;
Hat jemand Vorschläge zur Optimierung? Denn das Aufrufen dauert doch sehr lange...

omata 21. Dez 2004 18:32

Re: Optimierung von Abfrage
 
Moin,

was dauert jetzt lange?

Die Abfrage an die Datenbank oder dein Versuch selber noch weiter zu selektieren?

ich würde diese Arbeit immer auf die Datenbank auslagern.
Diese kann die SQL-Anweisung auswerten und die Arbeit die zum Zusammenstellen der Daten erforderlich ist optimieren. Du wirst niemals so gut sein wie die Datenbank!
Ausserdem kannst du so noch weitere Wünsche erfüllen, die du jetzt noch gar nicht kennst (glaube mir, wenn du etwas für andere schreibst -> denen fallen bestimmt noch andere schöne Dinge ein)
Damit du also nicht gleich am Poller bist, würde ich soviel wie möglich auf die Datenbank auslagern.

MfG
Thorsten

Klarabella 22. Dez 2004 07:21

Re: Optimierung von Abfrage
 
Naja, und das war halt am Anfang auch mein Problem.
Als ich die Datenbank die Abfrage habe komplett machen lassen, da hat das Laden aus der Datenbank etwa 15 Minuten gedauert.
Jetzt braucht das Ganze "nur" noch 10, aber ist halt immer noch zu lang - immerhin werden nur zwischen 5 und 40 Datensätze angezeigt...!
Und da nervt das lange Warten - zumindest diejenigen, für die das Prog ist... Ich hab Zeit :mrgreen:

Neelix 22. Dez 2004 07:37

Re: Optimierung von Abfrage
 
Guten Morgen Klarabella,

mir stellen sich da folgende Fragen:
  • Welche Datenbank verwendest Du?
  • Wieviel Datensätze befinden sich in der Tabelle?
  • Sind die Felder, die in der WHERE-Klausel indiziert?
Ein Tip: Nimm mal das BETWEEN raus und frage die Datümer mit > und < ab!

Klarabella 22. Dez 2004 07:47

Re: Optimierung von Abfrage
 
1. Sybase Adaptive Server Anywhere
2. Garantie_View1 hat 646 Datensätze
Garantie_View2 hat 467 DS
3. Indiziert??? Was soll das sein? :oops: Sorry, aber kenn mich nicht sooo gut aus mit Datenbanken...

Den Vorschlag mit < > werd ich mal ausprobieren...!

Gruß, Klarabella

Neelix 22. Dez 2004 08:05

Re: Optimierung von Abfrage
 
Zitat:

Zitat von Klarabella
3. Indiziert??? Was soll das sein? :oops: Sorry, aber kenn mich nicht sooo gut aus mit Datenbanken...

indiziert heißt, über diese ist ein Index gelegt. Aber so ein paar Datensätzen sollte es eigentlich trotzdem schneller gehen, es sei denn, diese Views (habe ich aus dem Namen geschlossen!) greifeb auf richtig große Tabellen (eventuell sogar mehrere!?) zu. Dann hat die Datenbank natürlich so einiges zu tun!

Klarabella 22. Dez 2004 08:12

Re: Optimierung von Abfrage
 
Zitat:

Zitat von Klarabella
Zunächst werden von meinem Programm aus zwei Views auf die Datenbank erstellt. Dies geht recht schnell.

Das ist es ja grad... Die Views greifen auf sehr viele Tabellen zu.
Deswegen hab ich ja überhaupt die beiden Views erstellt. Weil sonst dauerts gleich noch länger...!

//edit: Wie legt man denn den Index auf die Felder???

Neelix 22. Dez 2004 08:35

Re: Optimierung von Abfrage
 
Zitat:

Zitat von Klarabella
Zitat:

Zitat von Klarabella
Zunächst werden von meinem Programm aus zwei Views auf die Datenbank erstellt. Dies geht recht schnell.


Das habe ich doch glatt überlesen. :wall:
Einen Tip zum Optimieren der Abfrage zu geben grenzt zur Zeit an das Lesen im Kaffeesatz, da wir ja die Tabellenstruktur und das CREATE der Views nicht kennen.
Einen Index erstellt man wie folgt (zumindest in Informix):
SQL-Code:
CREATE INDEX indexname ON tabellenname (spaltenname [, spaltenname, ...] [ASC|DESC], ...)
Index auf Views gehen IMHO aber nicht, sondern nur auf Tabellen.

Klarabella 22. Dez 2004 08:45

Re: Optimierung von Abfrage
 
Ich dachte, wenn die Views einmal "existieren", dann funktioniert eine Abfrage genauso schnell wie auf eine normale Tabelle. Oder läd denn ein view immer wieder die Daten neu aus den Tabellen heraus?

Das Erstellen der Views geht sehr schnell. Nur später das Abfragen aus den Views dauert ewig...

Ist es mit einer View denn nicht eigentlich schneller?

Jelly 22. Dez 2004 08:59

Re: Optimierung von Abfrage
 
Zitat:

Zitat von Klarabella
Oder läd denn ein view immer wieder die Daten neu aus den Tabellen heraus?

JA. Sie erleichtern aber erheblich den Umgang mit deinen Daten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:29 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