Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.434 Beiträge
 
Delphi 7 Professional
 
#4

AW: Access SQL Query optimieren?

  Alt 14. Jan 2024, 13:27
Über welche Datenmengen reden wir denn überhaupt? 16 Sekunden bei 100 Sätzen ist sicherlich lang, 16 Sekunden bei 100.000.000.000 eher nicht Wie groß ist die Datenbankdatei?

Nur hingedaddelt und ungetestet und zusätzlich keine Ahnung, ob Access mit 'ner Syntax in der Form zurechtkommt. Aber eventuell wird verständlich, worauf ich hinausmöchte. Und ob das dann auch noch schneller wird kommt auf Versuch und Irrtum an. Grundsätzlich versuche ich bei großen Datenmengen diese möglichst früh maximal einzuschränken, bevor per Join mehrere Tabellen zusammengefügt werden. (Und Ja, die Lesbarkeit von SQL-Statements kann darunter leiden. Kürzere Laufzeiten gehen leider zuweilen (massiv) zu Lasten der Lesbarkeit der SQLs.)
SQL-Code:
select
  ABFDocAuftragNr,
  ABFDocDatum,
  ABFDocKundeKurzbez,
  IIF(Count(ABFDocAuftragID) > 1,Max(ABFPosMenge) - Min(ABFPosMenge), Max(ABFPosMenge)) as offen
from
(
  (
    select ABFDocAuftragNr, ABFDocDatum, ABFDocKundeKurzbez, ABFDocAuftragID
    from ABFDoc
    where ABFDocOptFertig = false
      and ABFDocVisType = 1
  ) a
  inner join
  (
    select ABFPosArtNr, ABFPosMenge
    from ABFPos
    where ABFPosEPreis > 0
      and ABFPosType in(0,7)
      and ABFPosNr <> '
      and ABFPosArtNr = :ArtNr
  ) b on b.ABFPosAuftragID = a.ABFDocAuftragID
) c
group by
  ABFDocAuftragNr,
  ABFDocDatum,
  ABFDocKundeKurzbez,
  ABFdocVisType
order by
  ABFDocAuftragNr;
Den inner join sArtikel on c.ABFPosArtNr = sArtikel.ArtNr hab' ich rausgenommen, da für mich nicht erkennbar ist, ob und ggfls. wofür ein Join auf diese Tabelle erforderlich sein sollte. Im Ergebnis scheinen keine Daten aus sArtikel enthalten zu sein, für die Wherebedingungen scheint sie auch nicht benötigt zu werden. Dann ist sie in diesem SQL eigentlich auch überflüssig und frist nur Speicher und Laufzeit.

Bevor Du anfängst an Windows und / oder Hardware zu schrauben, schau bitte erstmal, ob Du datenbankseitig eine Beschleunigung hinbekommst. Datenträger haben nunmal Zugriffzeiten > 0, von daher werden Datenbankabfragen auch immer mit Laufzeiten > 0 ausgeführt. Und wenn es dann auch noch über ein Netzwerk geht, muss der APP PC (bei Access) halt die ganze Datenbankdatei "mal eben über die Leitung ziehen", um dann die Auswertung vornehmen zu können. Access ist halt keine Datenbank, bei der der Client sagen kann. "Lieber Datenbankserver gib mir mal die Daten entsprechend der Dir hiermit übergebenen Abfrage."

Letztlich sind wir dann aber wieder bei dem Thema: Access Datenbank langsam, vermutlich reden wir hier über das gleiche WW-System?
  Mit Zitat antworten Zitat