Subselects

Thomas220

Benutzer
Beiträge
17
Hallo zusammen, ich verwende Heidi-SQL und greife auf eine Maria-DB zu.
Die Performance der DB ist eigentlich recht passabel. Nun habe ich eine Abfrage mit rund 10 Subselects, die die DB offenbar an ihre Grenzen bringt. Es dauert ca. 1 Stunde, bis das Ergebnis vorliegt.
Habe hier im Forum gelesen, dass ein JOIN besser wäre. Finde aber nichts, wie man das auf die selbe Tabelle einsetzen kann.
Code:
select Tour, Datum
, (select min(zeit) from ber_aktuell where scannart='13' and Tour=t1.tour) as Erste
, (select max(zeit) from ber_aktuell where scannart='13' and Tour=t1.tour ) as Letzte
, (select count(distinct stopp) from ber_aktuell where scannart='3' and tour=t1.tour ) as Stopps
, (select count(paketnummer) from ber_aktuell where scannart='3' and tour=t1.tour ) as Uebernommen
, (select count(paketnummer) from ber_aktuell where scannart='13' and tour=t1.tour ) as Geliefert
,  ROUND((select count(paketnummer) from ber_aktuell where scannart='13' and tour=t1.tour )
    / (select count(paketnummer) from ber_aktuell where scannart='3' and tour=t1.tour )*100,2) as 'Quote'
, (select count(paketnummer) from ber_aktuell where scannart='13' and tour=t1.tour and paketart=1) as BP
, (select count(paketnummer) from ber_aktuell where scannart='13' and tour=t1.tour and paketart=2) as QP
, (select count(paketnummer) from ber_aktuell where scannart='13' and tour=t1.tour and paketart=3) as SP
, ROUND((select count(paketnummer) from ber_aktuell where scannart='13' and tour=t1.tour and paketart=2)
    / (select count(paketnummer) from ber_aktuell where scannart='13' and tour=t1.tour )*100,2) as 'QP-Anteil'
, (select count(paketnummer) from ber_aktuell where scannart='5' and tour=t1.tour) as Gebracht
, (select count(paketnummer) from ber_aktuell where scannart='14' and tour=t1.tour) as 'nicht geliefert'
from ber_aktuell t1
where tour between '350' and '389'
group by tour, datum

In der Tabelle 'ber_aktuell' sind etwa 150.000 Datensätze mit 43 Spalten enthalten. Der Datumswert ist immer der gleiche. Also relativ überschaubar.
Hat jemand eine Idee, wie ich das besser machen könnte.

Danke.

Thomas
 
Werbung:
Habe hier im Forum gelesen, dass ein JOIN besser wäre. Finde aber nichts, wie man das auf die selbe Tabelle einsetzen kann.

Dazu verwendet man halt Aliase, dann kann man ein und dieselbe Tabelle mehrfach joinen. Deine "tour=t1.tour" erscheinen mir unsinnig, die einzelnen Kriterien für BP, QP und SP könnte man via FILTER eleganter schreiben - wenn MySQL das denn könnte. Zur Not könnte man das aber via CASE WHEN ... emulieren. Ein EXPLAIN könnte Dir zeigen, ob und welche Indexe verwended werden bzw. welche Scan-Methoden zum Einsatz kommen - wenn denn das MySQL-Explain das anzeigen könnte. Kann es nicht wirklich.
 
Hallo akretschmer vielen Dank für Deine Zeilen.
Aber hätte, hätte - Fahrradkette.
Es ist zwar schön zu wissen, was nicht geht, besser ist zu wissen, was geht.

Dennoch vielen Dank
Thomas
 
Werbung:
Nun ja, einiges kannst Du ja umsetzen, z.B. das Joinen via Aliase und cas mit CASE WHEN. Das MySQL vieles nicht kann kann ich wiederum nicht ändern. Möglicherweise falsche Wahl der Datenbank Deinerseits. Aber das kannst Du ja ändern.
 
Zurück
Oben