Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Abfrage dauert und dauert (https://www.delphipraxis.net/210016-abfrage-dauert-und-dauert.html)

ts-d 17. Feb 2022 13:11

Abfrage dauert und dauert
 
Eine Abfrage dauert so ewig lang.
Eine andere ist vorgeschaltet. Sie listet nur Auftragsnummern, bei denen bestimmte Kriterien erfüllt sind: Hauptartikel wird abgefragt mit Position 3.0 beispielsweise und Unterposition 3.5 beispielsweise. Das geht ruck zuck (ca. 0,5 Sekunden).

Dann schalte ich eine Detailansicht hinterher. Hier werden ein paar Infos aus verschiedenen Tabellen zusammengetragen (gemeinsame Auftrags- und sonstige Details und dann die Details zum Hauptartikel bzw. zum Unterartikel). Das dauert pro Abfrage ca. 10 Sekunden. Das ist untragbar. Mache ich da was falsch bzw. kann ich da noch Zeit optimieren?

Code:

AuftrNum := DM_kalo.Q_HauptUnterPos.FieldByName('AUFTRNUM').As String;
h := DM_kalo.Q_HauptUnterPos.FieldByName('h').AsString;
a := DM_kalo.Q_HauptUnterPos.FieldByName('a').AsString;
b := DM_kalo.Q_HauptUnterPos.FieldByName('b').AsString;

SQLText1 := 'Select Ak.Auftrnum, Ku.Kurzbez, Ak.Kommname, Ap.positnum, Ap.Menge, Ap.Artikelbeschr, Ap.Bestaetpreis, Ap.rabattsatz ';
SQLText2 := 'from ''Auftragkopf.db'' Ak, ''Ku.DB'' Ku, ''Auftragpos.DB'' Ap, ''Art.DB'' Art where Ak.KUNDNUM = Ku.NUMMER and Ak.AUFTRNUM = Ap.AUFTRNUM and Ap.MODELLNUM = Art.ARTIKELNUM';

with DM_kalo.Q_HUPa_Details do begin
SQL.Clear;
SQL.Add(SQLText1);
SQL.Add(SQLText2);
SQLText := ' And Ak.Auftrnum = ''' + AuftrNum + ''' And Ap.positnum = ''' + h + '.' + a + '''';
SQL.Add(SQLText);
Open;
end;

with DM_kalo.Q_HUPb_Details do begin
SQL.Clear;
SQL.Add(SQLText1);
SQL.Add(SQLText2);
SQLText := ' And Ak.Auftrnum = ''' + AuftrNum + ''' And Ap.positnum = ''' + h + '.' + b + '''';
SQL.Add(SQLText);
Open;
end;

Union 17. Feb 2022 13:20

AW: Abfrage dauert und dauert
 
Durch die Verwendung von mehreren Tabellen im WHERE wird die Kardinaliät wahrscheinlich sehr groß (das Produkt aller Sätze aller angegebenen Tabellen). Stelle das lieber auf JOIN um. Dann versteht man es auch.

Könntest Du evtl. beim Posten von Code diesen auch in die richtigen Tags einschließen (Klick auf den Delphi-Helm im Edit-Menü)?

ts-d 17. Feb 2022 13:49

AW: Abfrage dauert und dauert
 
danke, mache ich das nächste Mal.

LEFT OUTER JOIN usw. ist allerdings hier gar nicht nötig - denn das sind hier ja lauter 1:1-Beziehungen bestehen.

Meinst Du es so:

Delphi-Quellcode:
Select Ak.Auftrnum, Ap.positnum ...
from ''Auftragkopf.db'' Ak RIGHT JOIN "Auftragpos.DB" Ap ON (Auftragkopf.AUFTRNUM = Auftragpos.AUFTRNUM)
where Ak.AUFTRNUM = Ap.AUFTRNUM ...;

freimatz 17. Feb 2022 14:06

AW: Abfrage dauert und dauert
 
Gibts bei Deiner Datenbank keinen Profiler? Der hat mir schon oft geholfen.
Ansosntne bitte in https://www.delphipraxis.net/15-datenbanken/

Redeemer 17. Feb 2022 15:06

AW: Abfrage dauert und dauert
 
LEFT OUTER JOIN benutzt man auch, um 1:1-Beziehungen zu bestimmen, wenn die gejointe Tabelle nicht für jeden Eintrag Zusatzinformationen bereithält. Und das ist auch der einzige Grund, warum man überhaupt 1:1-Beziehungen benutzt. Wenn du 1:1-Beziehungen hast, aber LEFT OUTER JOIN falsch ist, ist auch deine 1:1-Beziehung falsch.
Warum hier zwischen Auftragskopf und Positionen eine 1:1-Beziehung bestehen soll, ergibt logisch aber auch keinen Sinn. Es ist somit wahrscheinlich keine 1:1-Beziehung.

RIGHT OUTER JOIN ist meistens falsch, da es langsam ist, wenn Datenbanken dumme Sachen tun (was nicht der Fall sein muss). Außerdem ist es logisch weniger eingängig.

Das kartesische Produkt wie im ersten Beispiel ist eigentlich immer falsch. In MSSQL ist es sogar deprecated und wird einem angekreidet.

Union 17. Feb 2022 15:21

AW: Abfrage dauert und dauert
 
Zitat:

Zitat von ts-d (Beitrag 1502386)
danke, mache ich das nächste Mal.

LEFT OUTER JOIN usw. ist allerdings hier gar nicht nötig - denn das sind hier ja lauter 1:1-Beziehungen bestehen.

Meinst Du es so:

Delphi-Quellcode:
Select Ak.Auftrnum, Ap.positnum ...
from ''Auftragkopf.db'' Ak RIGHT JOIN "Auftragpos.DB" Ap ON (Auftragkopf.AUFTRNUM = Auftragpos.AUFTRNUM)
where Ak.AUFTRNUM = Ap.AUFTRNUM ...;

Ich meinte eher so
Code:
Select Ak.Auftrnum, Ku.Kurzbez, Ak.Kommname, Ap.positnum, Ap.Menge, Ap.Artikelbeschr, Ap.Bestaetpreis, Ap.rabattsatz
from Auftragkopf.db Ak
where Ak.AUFTRNUM = <Deine Parameter>
inner join Ku.DB Ku on Ku.NUMMER = Ak.KUNDNUM
inner join Auftragpos.DB Ap on Ap.Auftrnum = ak.Auftrnum
inner join Art.DB Art on Art.Artikelnum = Ao.Modellnum

haentschman 17. Feb 2022 15:45

AW: Abfrage dauert und dauert
 
Indizies auf den benötigten Spalten des "where"? :gruebel:

hoika 17. Feb 2022 16:53

AW: Abfrage dauert und dauert
 
Hallo,
Zitat:

Mache ich da was falsch bzw. kann ich da noch Zeit optimieren?
1. Du sagst uns die DB nicht.
2. Du zeigst uns die Tabellenstruktur (dazu gehören die Indices, wie gerade schon geschrieben) nicht.

ts-d 17. Feb 2022 16:53

AW: Abfrage dauert und dauert
 
ja habe ich - danke

Von einem Profiler weiß ich jetzt nichts. Das ist eine Gupta-Datenbank.

Den Left Join benötige ich - diese Beziehung läuft halt einfach andersherum.

ts-d 17. Feb 2022 16:55

AW: Abfrage dauert und dauert
 
Zitat:

Zitat von hoika (Beitrag 1502401)
Hallo,
Zitat:

Mache ich da was falsch bzw. kann ich da noch Zeit optimieren?
1. Du sagst uns die DB nicht.
2. Du zeigst uns die Tabellenstruktur (dazu gehören die Indices, wie gerade schon geschrieben) nicht.


Wie kann ich die hier übersichtlich darstellen?
Eigentlich sind die Abhängigekeiten selbstredend - sie ergeben sich ja aus den Bezeichnungen, oder?


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:33 Uhr.
Seite 1 von 2  1 2      

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