ORDER BY Geschwindigkeitsoptimierung ...

Advantage Database Server

Moderator: Moderatoren

Antworten
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

ORDER BY Geschwindigkeitsoptimierung ...

Beitrag von UliTs »

Hallo allerseits,

ich möchte mittels JOIN zwei Tabellen miteinander verknüpfen und mit ORDER BY sortieren.
Leider habe ich dabei ziemliche Geschwindigkeitsprobleme.
Mein Problem entspricht dem Folgenden:
Es gibt eine Anzahl Kunden, die wiederum viele Aufträge vergeben haben.
Jetzt möchte ich eine Liste über die Kunden haben, bei denen der letzte Auftrag ebenfalls aufgeführt wird und die nach dem Datum des jeweils letzten Auftrags sortiert ist.
Meine derzeitige Lösung sieht wie folgt aus (zu langsam):

Code: Alles auswählen

SELECT         FAS.FASNr,FAS.FASId,FAS.StartD,FAu.*
FROM           Kunden FAu
LEFT OUTER JOIN Auftraege FAS ON FAS.FAuId=FAu.FAuId
WHERE FAS.FASNr IN
  ( SELECT     MAX( FAS3.FASNr ) FASNr         // Der letzte Auftrag hat die höchste Nummer
    FROM       Auftraege FAS3
    WHERE      FAS3.FAuId=FAu.FAuId
  )
ORDER BY FAS.StartD DESC,FAu.KundenName
Es gibt mehrere 10.000 Kunden und mehrere 1.000.000 Aufträge. Obiges dauert trotz bestehender Indizes mehrere Sekunden ...

Weiss jemand eine bessere Lösung?

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: ORDER BY Geschwindigkeitsoptimierung ...

Beitrag von brandelh »

SQL ist ja nicht meine Stärke, aber ich denke dass er für alle Sätze in

Code: Alles auswählen

SELECT         FAS.FASNr,FAS.FASId,FAS.StartD,FAu.*
dann in der WHERE Clausel prüft ob und welchen er haben will.
Das bedeutet aber auch, dass die 2. DB viel Arbeit bekommt.

Wenn ich das mit Clipper machen müsste, würde ich in der größeren Auftragsliste zunächst nach Kundennummer + ABSTEIGENDEM Datum sortieren / indizieren.
Dann daraus mit fseek() den Kundensatz je Auftrag suchen und die zusätzlichen Daten sammeln.

Falls auch Kunden vorkommen können, die KEINEN Auftrag aufgegeben haben, müsste man die Kunden durch, und dann in der sortierten Zwischendatei suchen.
Der Vorteil, durch diese Sortierung (letzter zuerst) hat man nach dem SEEK sofort den gewünschten Satz.

Wie man diese Logik nun nach SQL bringt weiß ich nicht ;-)
Eventuell kann man ja die Zwischenergebnisse auf eine RAM-DISK auslagern ... oder den Index mit Absteigendem Datum zusätzlich bereitstellen.
Oder dem Server mehr RAM zur Verfügung stellen, damit er mehr puffern kann ... ?

Wobei einige Sekunden bei 100000 Antwortzeilen kommt mir jetzt nicht gerade langsam vor.
Gruß
Hubert
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: ORDER BY Geschwindigkeitsoptimierung ...

Beitrag von UliTs »

Also mit einem "blöden" Trick habe ich es jetzt hinbekommen, dass der ADS innerhalb 0,3 Sekunden die SQL-Tabelle bestimmt:

Code: Alles auswählen

...
LEFT OUTER JOIN Auftraege FAS ON FAS.StartD > '0000-00-00' AND  FAS.FAuId=FAu.FAuId
...
Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: ORDER BY Geschwindigkeitsoptimierung ...

Beitrag von UliTs »

UliTs hat geschrieben:Also mit einem "blöden" Trick habe ich es jetzt hinbekommen, dass der ADS innerhalb 0,3 Sekunden die SQL-Tabelle bestimmt:
...
Wie ich heute festgestellt habe, funktioniert der Trick nur für den Windows ADS 10.1 aber leider nicht für den Linux ADS 10.1 :-( .

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: ORDER BY Geschwindigkeitsoptimierung ...

Beitrag von nightcrawler »

Lass Dir mal den Plan im ARC anzeigen (gegen Windows und gegen Linux Server). Evtl wird ein Index wegen falsch eingestellter Collation nicht genutzt.
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Antworten