AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Abfrage dauert und dauert

Ein Thema von ts-d · begonnen am 17. Feb 2022 · letzter Beitrag vom 17. Feb 2022
Antwort Antwort
Seite 1 von 2  1 2      
ts-d

Registriert seit: 29. Apr 2008
31 Beiträge
 
#1

Abfrage dauert und dauert

  Alt 17. Feb 2022, 13:11
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;
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Abfrage dauert und dauert

  Alt 17. Feb 2022, 13:20
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ü)?
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
ts-d

Registriert seit: 29. Apr 2008
31 Beiträge
 
#3

AW: Abfrage dauert und dauert

  Alt 17. Feb 2022, 13:49
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 ...;
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.380 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Abfrage dauert und dauert

  Alt 17. Feb 2022, 14:06
Gibts bei Deiner Datenbank keinen Profiler? Der hat mir schon oft geholfen.
Ansosntne bitte in https://www.delphipraxis.net/15-datenbanken/
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.017 Beiträge
 
Delphi 2009 Professional
 
#5

AW: Abfrage dauert und dauert

  Alt 17. Feb 2022, 15:06
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.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: Abfrage dauert und dauert

  Alt 17. Feb 2022, 15:21
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
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.297 Beiträge
 
Delphi 12 Athens
 
#7

AW: Abfrage dauert und dauert

  Alt 17. Feb 2022, 15:45
Indizies auf den benötigten Spalten des "where"?
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Abfrage dauert und dauert

  Alt 17. Feb 2022, 16:53
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.
Heiko
  Mit Zitat antworten Zitat
ts-d

Registriert seit: 29. Apr 2008
31 Beiträge
 
#9

AW: Abfrage dauert und dauert

  Alt 17. Feb 2022, 16:53
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.
  Mit Zitat antworten Zitat
ts-d

Registriert seit: 29. Apr 2008
31 Beiträge
 
#10

AW: Abfrage dauert und dauert

  Alt 17. Feb 2022, 16:55
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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 23:20 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