Brauche Hilfe für Query Optimierung

Pol

Mitglied
Hallo
Ich brauche dies folgende View um die Zeiten zu berechnen. Die Query selber funktioniert nicht schlecht.
Wenn ich die ersten 30 (aus 50'000) Datensätze abfrage, dann dauer die Antwort ca. 0.0012 Sekunden. (PhpMyAdmin Mysql 5)

Wenn ich aber eine Gruppierung pro Tag und User vornehme dann habe ich die Antwort Zeiten von 0.37 Sekunden. Das ist zu langsam.
Könnt ihre bitte mal die Query anschauen? Wie kann ich diese verbessern?...
....
arbeitszeit.gs AS gs,
arbeitszeit.ge AS ge,
((Time_To_Sec(TimeDiff(arbeitszeit.ezeit, arbeitszeit.szeit)) / 3600) -
arbeitszeit.arbzpause) AS Netto,
(CASE
WHEN ((arbeitszeit.szeit >= arbeitszeit.gs) AND (arbeitszeit.ezeit <=
arbeitszeit.ge) AND (Find_In_Set(DayOfWeek(arbeitszeit.arbzstart),
arbeitszeit.awochenprofil) > 0) AND (arbeitszeit.arbszart <> 'Feiertag'))
THEN ((Time_To_Sec(TimeDiff(arbeitszeit.ezeit, arbeitszeit.szeit)) / 3600) -
arbeitszeit.arbzpause)
WHEN ((arbeitszeit.szeit < arbeitszeit.gs) AND (arbeitszeit.ezeit >
arbeitszeit.gs) AND (arbeitszeit.ezeit <= arbeitszeit.ge) AND
(Find_In_Set(DayOfWeek(arbeitszeit.arbzstart), arbeitszeit.awochenprofil) >
0) AND
(arbeitszeit.arbszart <> 'Feiertag')) THEN
((Time_To_Sec(TimeDiff(arbeitszeit.ezeit, arbeitszeit.gs)) / 3600) -
arbeitszeit.arbzpause)
WHEN ((arbeitszeit.szeit >= arbeitszeit.gs) AND (arbeitszeit.szeit <
arbeitszeit.ge) AND (arbeitszeit.ezeit > arbeitszeit.ge) AND
(Find_In_Set(DayOfWeek(arbeitszeit.arbzstart), arbeitszeit.awochenprofil) >
0) AND
(arbeitszeit.arbszart <> 'Feiertag')) THEN
((Time_To_Sec(TimeDiff(arbeitszeit.ge, arbeitszeit.szeit)) / 3600) -
arbeitszeit.arbzpause) ELSE 0 END) AS IST,
(CASE
WHEN ((arbeitszeit.szeit < arbeitszeit.gs) AND (arbeitszeit.ezeit >
arbeitszeit.gs) AND (arbeitszeit.ezeit <= arbeitszeit.ge) AND
(Find_In_Set(DayOfWeek(arbeitszeit.arbzstart), arbeitszeit.awochenprofil) >
0) AND
(arbeitszeit.arbszart <> 'Feiertag')) THEN
(Time_To_Sec(TimeDiff(arbeitszeit.gs, arbeitszeit.szeit)) / 3600)
WHEN ((arbeitszeit.szeit >= arbeitszeit.gs) AND (arbeitszeit.szeit <
arbeitszeit.ge) AND (arbeitszeit.ezeit > arbeitszeit.ge) AND
(Find_In_Set(DayOfWeek(arbeitszeit.arbzstart), arbeitszeit.awochenprofil) >
0) AND
(arbeitszeit.arbszart <> 'Feiertag')) THEN
(Time_To_Sec(TimeDiff(arbeitszeit.ezeit, arbeitszeit.ge)) / 3600)
WHEN ((arbeitszeit.szeit < arbeitszeit.gs) AND (arbeitszeit.ezeit <
arbeitszeit.gs) AND (Find_In_Set(DayOfWeek(arbeitszeit.arbzstart),
arbeitszeit.awochenprofil) > 0) AND (arbeitszeit.arbszart <> 'Feiertag'))
THEN ((Time_To_Sec(TimeDiff(arbeitszeit.ezeit, arbeitszeit.szeit)) / 3600) -
arbeitszeit.arbzpause)
WHEN ((arbeitszeit.szeit > arbeitszeit.ge) AND (arbeitszeit.ezeit >
arbeitszeit.ge) AND (Find_In_Set(DayOfWeek(arbeitszeit.arbzstart),
arbeitszeit.awochenprofil) > 0) AND (arbeitszeit.arbszart <> 'Feiertag'))
THEN ((Time_To_Sec(TimeDiff(arbeitszeit.ezeit, arbeitszeit.szeit)) / 3600) -
arbeitszeit.arbzpause)
WHEN ((Find_In_Set(DayOfWeek(arbeitszeit.arbzstart),
arbeitszeit.awochenprofil) = 0) OR
(arbeitszeit.arbszart = 'Feiertag')) THEN
((Time_To_Sec(TimeDiff(arbeitszeit.ezeit, arbeitszeit.szeit)) / 3600) -
arbeitszeit.arbzpause) ELSE 0 END) AS Ue,
If((arbeitszeit.arbszart = 'Kompensation'),
((Time_To_Sec(TimeDiff(arbeitszeit.ezeit, arbeitszeit.szeit)) / 3600) -
arbeitszeit.arbzpause), 0) AS Komp,
....
Antwortzeiten ca. 0.0012 Sek


SELECT a.arbzid AS arbzid,
a.arbzusrid AS arbzusrid,
a.abszpensum AS abszpensum,
a.abszsollstd AS abszsollstd,
CAST(a.arbzstart AS date) AS Tag,
a.arbszart AS arbszart,
Sum(a.arbzpause) AS Pause,
(Sum(a.IST) - a.abszsollstd) AS PM,
Sum(a.IST) AS IST,
Sum(a.Ue) AS UEB,
Sum(a.Netto) AS Netto,
a.arbzstart AS arbzstart
FROM view_detailstest a
GROUP BY a.arbzusrid,
CAST(a.arbzstart AS date)

Anwortzeiten 0,37

Danke für jeden Hinweis..
mpol_ch
 
GROUP BY: da muss alles rein was nicht SUM ist. Jedes andere DBMS würde dir bei dieser Query sofort einen Fehler an den Kopf schmeissen...
 
Zurück