Hallo,
ich habe eine kleine Horrorquery, die ziemlich viel leisten muss, es auch tut, aber sich inzwischen auch seine Zeit dafür mimmt.
Und ich bin nicht sicher, wo ich anfangen soll, sie zu optimieren.
Sicher ist nur, dass sie optimiert wreden muss. Sie braucht so um die 7-8 Sekunden, wenn sie ungecached auf die DB trifft.
Wo kann ich ansetzen?
SELECT SQL_CALC_FOUND_ROWS DISTINCT
r.KundenID,
r....,
...da.ListenID,
ADDDATE(r.Rechnungsdatum,INTERVAL r.Faelligkeit DAY),
m.Mahnstatus,
ADDDATE(m.Mahndatum,INTERVAL m.Faelligkeit DAY),
r.bezahlt,
r.Storno,
UNIX_TIMESTAMP(ADDDATE(r.Rechnungsdatum,INTERVAL r.Faelligkeit DAY)),
UNIX_TIMESTAMP(ADDDATE(m.Mahndatum,INTERVAL m.Faelligkeit DAY)),
k.kdel,
SUM(ze.Bruttozahlung),
rz.GesamtRetoure
FROM _table_rechnungen r
LEFT JOIN _table_rechnungszuordnung rz ON r.RechnungenID = rz.RechnungenID
LEFT JOIN _table_zahlungseingang ze ON r.RechnungenID = ze.RechnungenID
LEFT JOIN _table_da_belege da ON da.BelegID = r.RechnungenID
LEFT JOIN _table_berechnungen b ON r.RechnungenID = b.RechnungenID
LEFT JOIN _table_mahnungen m ON ( r.RechnungenID = m.RechnungenID AND m.aktiv = 1)
AND m.RechnungenID =(SELECT MAX(tmp.RechnungenID) FROM _table_mahnungen tmp
WHERE tmp.RechnungenID = r.RechnungenID AND m.aktiv = 1)
LEFT JOIN _table_kunden k ON r.KundenID = k.KundenID
WHERE r.Belegart = "R"
GROUP BY r.RechnungsNummer
ORDER BY r.RechnungenID DESC LIMIT 450,50
Explain zur Query.
Was ich z.b. selber schon gemerkt habe, ist, dass ich ohne die Spalte SUM(ze.Bruttozahlung)
ca. 2 Sekunden spare, aber diese Spalte benötoge ich halt. 😕
Wenn ich quasi alle Spalten weglasse, aber die Where-Bedingung bleibt 1:1 erhalten, ist die Query auch signifikant schneller, was mich eigentlich wundert. Die wenigen Berechnungen in den Spalten sollten soviel doch gar nicht ausmachen, oder? Jörg