Rolf B: mysql, Query optimieren

Beitrag lesen

Hallo Jörg,

Liegt daran, dass es zu jeder Rechnung mehr als 1 Mahnung geben kann, die sich nach Mahnstufe unterscheiden und ich immer die höchste Mahnstufe nehmen wollte...

Ja ok, aber schau was da steht:

m.RechnungenID = (SELECT MAX(tmp.RechnungenID)
                            FROM _table_mahnungen tmp
                            WHERE tmp.RechnungenID = r.RechnungenID AND m.aktiv = 1)

Ein Auswählen der höchsten Mahnstufe erkenne ich da nicht.

Der Subselect wählt nur die Sätze aus, wo tmp.RechnungenID = r.RechnungenID ist. D.h. in den ausgewählten Mahnungszeilen sind die Werte für tmp.RechnungenID alle gleich, und zwar alle gleich r.RechnungenID. Davon ein Maximum zu bilden und damit zu vergleichen ist zwecklos.

Statt RechnungenID müsstest Du den maximalen Mahnstatus finden und damit vergleichen.

Mir ist aber was aufgefallen - prüf mal, ob deine Query noch sinnvolle Ergebnisse liefert. Ich habe nämlich übersehen, dass deine Relationen über die RechnungenID gebilet werden, der GROUP BY aber über RechnungenNummer. So richtig sinnvoll ist das wohl nur, wenn es zu einer RechnungenNummer mehrere RechnungenID gibt, und dann ist der SUM als Subselect wohl nicht zielführend. Deine ursprüngliche Query hat ja die Bruttozahlungen über alle Zahlungseingänge einer Rechnungsnummer gebildet, und nur eine Zeile pro Nummer geliefert. Ohne den GROUP BY RechnungenNummer liefert sie eine Zeile pro RechnungenID. Oder auch mehrere, wenn einer der LEFT JOINs mehr als eine Zeile liefert.

Wie man damit richtig umgeht, hängt von deinen Daten ab. Kannst Du sagen, wieviele Zeilen jeder LEFT JOIN maximal liefern kann? Wie stehen RechnungenNummer und RechnungenID zueinander in Beziehung, ist das 1:1, 1:N oder N:1? Ein M:N will ich jetzt mal ausschließen...

Prüfe dann noch, ob Du den DISTINCT in der ersten Zeile brauchst. Der kostet auf jeden Fall auch Zeit, und er war möglicherweise nur deshalb nötig, weil Du die Berechnungen-Tabelle unnötigerweise hinzugemischt hattest.

Rolf

--
sumpsi - posui - obstruxi