![]() |
Datenbank: MySQL • Version: 5 • Zugriff über: UniDac
SQL-Statement zu aufwendig
Hallo Zusammen,
ich habe eine Tabelle, in der die Artikel und die Kundenbedarfe stehen. Jetzt möchte ich gerne mit einer Query für jeden Disponenten folgende Daten holen: ArtikelNr, Lieferungen die überfällig sind (Lieferdatum<aktuelles Datum), Summe der Mengen je Artikel für aktuellen Monat, Summe der Mengen je Artikel für nächsten Monat, Summe der Mengen je Artikel für übernächsten Monat. Ich habe folgendes ausprobiert, aber neben der Tatsache, dass die Werte nicht stimmten, benötigt die Query auch über 30min.... WIe kann ich das geschickter machen?
Delphi-Quellcode:
select concat(liefersituation.watenr,' ',liefersituation.tebez1) as 'Artikel Bezeichnung', sum(t1.ltrest) as Rückstand, sum(t2.ltrest) as 'Bedarf aktueller Monat', sum(t3.ltrest) as 'Bedarf nächster Monat', sum(t4.ltrest) as 'Bedarf übernächster Monat' from liefersituation
left join liefersituation as t1 on t1.watenr=liefersituation.watenr and t1.ltlite<current_date left join liefersituation as t2 on t2.watenr=liefersituation.watenr and month(t2.ltlite)=month(current_date) left join liefersituation as t3 on t3.watenr=liefersituation.watenr and month(t3.ltlite)=month(current_date)+1 left join liefersituation as t4 on t4.watenr=liefersituation.watenr and month(t4.ltlite)=month(current_date)+2 where liefersituation.lpdivk='ssc' //Disponenten-Kürzel group by liefersituation.watenr order by liefersituation.watenr Vielen Dank Patrick |
AW: SQL-Statement zu aufwendig
Wie ist es, wenn Du den Disponenten als JOIN-Bedingung hinzufügst?
|
AW: SQL-Statement zu aufwendig
Zitat:
i.d.R. musst Du das groupen was Du im select anzeigst, wenn es keine agregatfunktion ist. Bei MS SQL würde die Anweisung gar nicht so gehen, mysql macht hier was, aber wie Du schon gemerkt hast stimmt das Ergebnis nicht! |
AW: SQL-Statement zu aufwendig
Hier wäre es vllt. einfacher das über Subselects zu lösen, denn wie arnof schon sagte, passt a) das Gruppieren nicht und b) stehen wahrscheinlich in dem Join mehr/weniger Datensätze drin, als eigentlich sollten. Kann man ja mal mit einem "Select *" prüfen.
|
AW: SQL-Statement zu aufwendig
Hallo,
keine Chance, der MySQL-Server kommt damit einfach nicht zurecht... Ich habe jetzt schon wieder ca. 30 min. gewartet - er ist noch nicht fertig... Gruß Patrick |
AW: SQL-Statement zu aufwendig
Du verwendest auf einigen Spalten eine Funktion (month), um das Ergebnis mit einer weiteren Funktion zu vergleichen.
Month(currentdate) usw. sollte kein Problem sein (Kopfrechnen), sowas wie month(<spalte>) macht aber idR die (hoffentlich vorhandenen) Indices unbrauchbar. Wenn Du das umformst nach
Code:
könnte es deutlich schneller laufen.
<spalte> between [anfang aktueller Monat] and current_date
Bevor Du nun lange bastelst, um den aktuellen Monatsanfang auszurechnen, probier es einfach mal mit festen Werten aus, vlt. "current_date - 27" (das wäre heute der 1.Mai.), ich kenne die Datumsfunktionen von mySQL leider nicht auswendig. |
AW: SQL-Statement zu aufwendig
Mal so als Tipp: Lass' alle Aggregatfunktionen (Sum) weg und auch das GroupBy muß kurz raus.
Und jetzt schau dir mal an, was deine Joints eingentlich veranstalten. (ich glaub nicht, daß es dem entspricht, was du willst) Im Grunde müssen die SUM-Felder also eher SubSelects sein, würde ich mir mal so denken. PS: Als [code=sql]...[/code] macht sich der obrige "Delphi"-Code bestimmt auch viel besser. |
AW: SQL-Statement zu aufwendig
Versuch es mal ganz ohne join:
SQL-Code:
Bezüglich der Syntax musst du das ggf. anpassen. Kann kein mist-QL.
select concat(watenr,' ',tebez1) as 'Artikel Bezeichnung',
sum(iif(ltlite < current_date, ltrest,0) as Rückstand, sum(iif(month(ltlite) = month(current_date) ,ltrest,0) as 'Bedarf aktueller Monat', sum(iif(month(ltlite) = month(current_date) + 1,ltrest,0) as 'Bedarf nächster Monat', sum(iif(month(ltlite) = month(current_date) + 2,ltrest,0) as 'Bedarf übernächster Monat' from liefersituation group by concat(watenr,' ',tebez1) Wichtig ist, das in deinem Group By- Ausdruck alle Ausdrücke angegeben sein müssen, die nicht aggregiert werden. Das dürfte so auch mit deiner 'Month' Klausel, da er eh nur 1x durch die Tabelle rennt. PS: Dein 'Bedarf aktueller Monat' enthält auch den Rückstand des aktuellen Monats.... also vielleicht alternativ...
SQL-Code:
...
sum(iif(ltlite >=current_date and month(ltlite) = month(current_date) ,ltrest,0) as 'Bedarf aktueller Monat', ... |
AW: SQL-Statement zu aufwendig
Zitat:
Beispiel aus meiner Praxis: SQL Abfrage aufgrund von Datenmengen beim Kunden nicht benutzbare 30 sec, durch setzen der Indexe passend zur Abfrage auf nicht mehr fühlbare 0.01 sec reduziert ohne eine Zeile Delphicode zu ändern! |
AW: SQL-Statement zu aufwendig
Meist benötigt man dazu keine Tools. Scharfes hinschauen genügt. Und wenn man etwas faul ist, scharfes Betrachten des Queryplans. Die von mir vorgeschlagene Optimierung (von der ich arroganterweise annehme, das sie eine schnellere Möglichkeit ist) bekommt ein Tool eh nicht hin. Behaupte ich mal.
Betonung allerdings auf 'meist', also für professionelle Optimierung als Lebensaufgabe oder Berufsdefinition sind solche Tools durchaus brauchbar. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz