![]() |
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:
Und die Zuweisung der Parameter in der Procedure FillGrid:
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);
Delphi-Quellcode:
...und hier die Übernahme vom ersten StringGrid (sgGarantie) in das zweite (sgGarantie_Daten):
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;
Delphi-Quellcode:
Hat jemand Vorschläge zur Optimierung? Denn das Aufrufen dauert doch sehr lange...
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; |
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 |
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: |
Re: Optimierung von Abfrage
Guten Morgen Klarabella,
mir stellen sich da folgende Fragen:
|
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 |
Re: Optimierung von Abfrage
Zitat:
|
Re: Optimierung von Abfrage
Zitat:
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??? |
Re: Optimierung von Abfrage
Zitat:
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:
Index auf Views gehen IMHO aber nicht, sondern nur auf Tabellen.
CREATE INDEX indexname ON tabellenname (spaltenname [, spaltenname, ...] [ASC|DESC], ...)
|
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? |
Re: Optimierung von Abfrage
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:37 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 by Thomas Breitkreuz