AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Optimierung von Abfrage
Thema durchsuchen
Ansicht
Themen-Optionen

Optimierung von Abfrage

Ein Thema von Klarabella · begonnen am 21. Dez 2004 · letzter Beitrag vom 22. Dez 2004
Antwort Antwort
Klarabella

Registriert seit: 28. Sep 2004
59 Beiträge
 
#1

Optimierung von Abfrage

  Alt 21. Dez 2004, 16:23
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...
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Optimierung von Abfrage

  Alt 21. Dez 2004, 19:32
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
  Mit Zitat antworten Zitat
Klarabella

Registriert seit: 28. Sep 2004
59 Beiträge
 
#3

Re: Optimierung von Abfrage

  Alt 22. Dez 2004, 08:21
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
  Mit Zitat antworten Zitat
Neelix

Registriert seit: 30. Nov 2004
Ort: Im Delta-Quadranten
84 Beiträge
 
#4

Re: Optimierung von Abfrage

  Alt 22. Dez 2004, 08:37
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!
  Mit Zitat antworten Zitat
Klarabella

Registriert seit: 28. Sep 2004
59 Beiträge
 
#5

Re: Optimierung von Abfrage

  Alt 22. Dez 2004, 08:47
1. Sybase Adaptive Server Anywhere
2. Garantie_View1 hat 646 Datensätze
Garantie_View2 hat 467 DS
3. Indiziert??? Was soll das sein? Sorry, aber kenn mich nicht sooo gut aus mit Datenbanken...

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

Gruß, Klarabella
  Mit Zitat antworten Zitat
Neelix

Registriert seit: 30. Nov 2004
Ort: Im Delta-Quadranten
84 Beiträge
 
#6

Re: Optimierung von Abfrage

  Alt 22. Dez 2004, 09:05
Zitat von Klarabella:
3. Indiziert??? Was soll das sein? 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!
  Mit Zitat antworten Zitat
Klarabella

Registriert seit: 28. Sep 2004
59 Beiträge
 
#7

Re: Optimierung von Abfrage

  Alt 22. Dez 2004, 09:12
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???
  Mit Zitat antworten Zitat
Neelix

Registriert seit: 30. Nov 2004
Ort: Im Delta-Quadranten
84 Beiträge
 
#8

Re: Optimierung von Abfrage

  Alt 22. Dez 2004, 09:35
Zitat von Klarabella:
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.
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):
CREATE INDEX indexname ON tabellenname (spaltenname [, spaltenname, ...] [ASC|DESC], ...) Index auf Views gehen IMHO aber nicht, sondern nur auf Tabellen.
  Mit Zitat antworten Zitat
Klarabella

Registriert seit: 28. Sep 2004
59 Beiträge
 
#9

Re: Optimierung von Abfrage

  Alt 22. Dez 2004, 09:45
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?
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Optimierung von Abfrage

  Alt 22. Dez 2004, 09:59
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.
  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 17:55 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