dedlfix: MySQL Abfrage

Beitrag lesen

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!