Hi!
ich habe hier eine Datenbank, die ich nicht verändern kann.
Das ist schlecht und wird vermutlich das Haupt-Hindernis sein, eine zufriedenstellende Lösung zu finden.
Ich kann also keinen Index vergeben oder dergleichen. (Index sollte aber vergeben sein)
Wo die Indexe liegen, wäre interessant und vor allem, ob sie überhaupt genutzt werden. Das sagt dir der Ausführungsplan deines DBMS, welchen du mit einem vorangestellten EXPLAIN bekommst.
Kann man folgende Abfrage irgendwie schneller machen?
Interessant wäre auch der Aufbau der Tabellen. So kann man ihn nur anhand der Verknüpfungsbedingungen erraten. Apropos Verknüpfungsbedingungen: Diese lassen sich syntaktisch besser von den Auswahlverknüpfungen unterscheiden, wenn man die explizite JOIN-Syntax verwendet. Die Geschwindigkeit wird das nicht beinflussen, nur die des Lesers.
Das ist Wahnsinn wie lange die teilweise braucht, selbst wenn ich nur 1 Tag von einem Vertreter abfragen lassen will.
Außer einer kleinen Verkürzung durch den Einsatz von IN() fällt mir nichts ein. Ein Index auf rechnung.r_datum_faellig wäre vermutlich hilfreich. Teste deine Versuche stets auch mit EXPLAIN, um zu sehen, wo ein full table scan statt eines Index verwendet wird und dränge bei den Datenbankverantwortlichen auf eine Änderung. Dazu ist es vermutlich hilfreich, wenn du beweisen kannst, dass die Änderung was bringt. Das könntest du an einem zum Test parallel aufgesetzten System probieren und vorführen.
SELECT
produktgruppe.p_name,
SUM (rechnungpos.r_gesamtwert) AS summe
FROM rechnung
JOIN kunde ON rechnung.r_kunde_id = kunde.k_id
JOIN vertreter_kunde ON vertreter_kunde.v_kunde_id = kunde.k_id
JOIN vertreter ON vertreter_kunde.v_vertreter_id = vertreter.v_id
JOIN rechnungpos ON rechnungpos.r_rechnung_id = rechnung.r_id
JOIN auftragpos ON rechnungpos.r_auftragpos_id = auftragpos.a_id
JOIN produkt ON auftragpos.a_produkt_id = produkt.p_id
JOIN produkt_produktgrp ON produkt.p_id = produkt_produktgrp.p_produkt_id
JOIN produktgruppe ON produkt_produktgrp.p_produktgrp_id = produktgruppe.p_id
WHERE
vertreter.v_id = :vertreter AND
produktgruppe.p_nr NOT IN ('1', '2', '3', '4', '5') AND
rechnung.r_datum_faellig >= :vondate AND
rechnung.r_datum_faellig < :bisdate
GROUP BY produktgruppe.p_name
ORDER BY produktgruppe.p_name ASC
ORDER BY kann entfallen, da ein GROUP BY unter MySQL automatisch sortiert (wird aber keinen Geschwindigkeitsvorteil bringen).
Ein
rechnung.r_datum_faellig BETWEEN :vondate AND :bisdate
scheitert vorläufig daran, dass es das bisdate einschließen würde, du es aber ausgeschlossen haben möchtest, was sich aber durch ein Verringern des bisdate um einen Tag ändern ließe. Ob es einen Geschwindigkeitsvorteil bringt? Teste es!
Lo!