MySQL Anderer Query-Ansatz?

Horschie

Mitglied
Hallo,

die nachfolgende Query führt eine Bestandskontrolle für jeden Artikel durch.

Der Artikel soll dann ausgewählt werden,
wenn
- in den letzten 7 Tagen Warenausgänge existieren
und
- der aktuelle Bestand < den Ausgängen der letzten 7 Tage ist.

oder: Der aktuelle Bestand ist < 0.


Ergänzend: Der erste Block in der QUery, welcher prüft ob überhaupt Ausgänge existieren, spart etwa
40s. Die aktuelle Laufzeit der Abfrage beträgt direkt auf dem Server ~45s.


Code:
SELECT DISTINCT * FROM daten_artikel WHERE 

(EXISTS 
(SELECT ID FROM bew_lager_protokoll
WHERE ARTIKELNR = daten_artikel.ARTIKELNR AND Ursache = "Warenausgang" AND SUBDATE(NOW(), 7)) 

AND 

((SELECT coalesce(SUM(bew_lager_bestand.Bestand)) AS "Curbestand"
FROM bew_lager_bestand WHERE ARTIKELNR = daten_artikel.ARTIKELNR AND Artikeltyp <> "Gesperrt" AND Bestand > 0) 
< 
(SELECT coalesce(SUM(MengeAlt - MengeNeu)) FROM bew_lager_protokoll 
WHERE Ursache = "Warenausgang" AND bew_lager_protokoll.ARTIKELNR = 
daten_artikel.ARTIKELNR AND Datum > SUBDATE(NOW(), 7))) 

OR 
(EXISTS (SELECT * 
FROM bew_lager_bestand WHERE ARTIKELNR = daten_artikel.ARTIKELNR AND Artikeltyp <> "Gesperrt" AND Bestand < 0)
))

Kann man das mit einer veränderten Query noch deutlich beschleunigen?

Danke!
Christoph
 
Zuletzt bearbeitet:
Es sind ungefähr
12000 Artikel
13000 Bestände
550 Warenbewegungen (noch...)

Das so eine Abfrage schon Zeit braucht ist mir durchaus bewusst. Aber ich bin jetzt auch nicht DER Datenbankexperte.
Vlt ist die Sache mit dem Exists ja schon unsinnig...?


Grüße
 
Zuletzt bearbeitet:
Einerseits kann die Reihenfolge der Subquerys die Laufzeit verbessern aber auch verschlechtern.

Aber was mir aufgefallen ist du fragst 2x den Lagerbestand ab. Einmal prüfst du gegen > 0 und einmal gegen < 0
Ich würde meinen du könntest dir hier etwas sparen!

Außerdem SELECT * FROM ist unperformanter als SELECT [spezifische Spalten] FROM
 

Zurück
Oben