1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Subselects

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Thomas220, 2 Januar 2018.

  1. Thomas220

    Thomas220 Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  3. Thomas220

    Thomas220 Benutzer

    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
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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.
     

Diese Seite empfehlen