maik87
Goto Top

MySQL - Abfrage optimieren

Hallo Gemeinde,

ich habe in MySQL eine Tabelle, die folgenden Aufbau hat:

JahrMonat - BereichsID - a - b - c - d ...
201001 - 1 - ...
201002 - 1 - ...
201003 - 1 - ...
201004 - 1 - ...
201005 - 1 - ...

Es werden monatsbezogen für mehrere Bereiche verschiedene Spalten (a - d in diesem Beispiel) gespeichert. Jetzt benötige ich eine Abfrage, in der ich mehrere Monate zusammenfasse und dabei die Spalten miteinander verrechne:

SELECT ((t1.a + t1.b + t1.c) - (t1.d)) AS Daten01,((t2.a + t2.b + t2.c) - (t2.d)) AS Daten02,((t3.a + t3.b + t3.c) - (t3.d)) AS Daten03
FROM tabelle t1 LEFT JOIN tabelle t2 on (t1.BereichsID = t2.BereichsID) LEFT JOIN tabelle t3 on (t2.BereichsID = t3.BereichsID)
WHERE t.BereichsID = 1234

So oder so ähnlich (aus dem Kopf getipt - ungetestet) sieht meine Abfrage aus, die auch laufen würde. Jedoch braucht diese einige Sekunden, obwohl "keine" Daten drin sind.
Wie bekomme ich das Ding schneller? Wie kann ich zusätzlich noch die Monate mit einschränken?

Danke euch!!

Content-Key: 181645

Url: https://administrator.de/contentid/181645

Printed on: April 24, 2024 at 04:04 o'clock

Member: nxclass
nxclass Mar 07, 2012 at 22:38:32 (UTC)
Goto Top
tut mir Leid - aber deine Abfrage ergibt keinen Sinn !?

  • wozu die Berechnungen 3 mal durchführen
  • über die selbe Tabelle (selbe Daten)
  • und mit LEFT Join verbinden

... was erwartest Du für eine Ausgabe ?

in der ich mehrere Monate zusammenfasse und dabei die Spalten miteinander verrechne
da müsste doch irgendwo auch auf JahrMonat bezug genommen werden
Member: Maik87
Maik87 Mar 07, 2012 at 22:47:09 (UTC)
Goto Top
Sorry, du hast Recht...
Wie ging es weiter...!?

WHERE t1.BereichsID = 1234 AND t1.JahrMonat = 201001 AND t2.JahrMonat = 201002 AND t3.JahrMonat = 201003

glaub ich...

Ich möchte die Daten, die Zeilenweise in der DB gespeichert sind als Spalten ausgeben.
Member: nxclass
nxclass Mar 08, 2012 at 08:51:03 (UTC)
Goto Top
verstehe - dazu muss ich aber sagen, dass die Datenbank (Datenbankabfrage) nicht die Aufgabe hat Ausgaben für die Ausgabe um zu formatieren.
Oder anders gesagt : Pivot - Tabellendarstellung kann nicht sinnvoll mit der Datenbankabfrage gemacht werden.
Member: Maik87
Maik87 Mar 08, 2012 at 09:02:22 (UTC)
Goto Top
Ja, dass es nicht optimal ist, habe ich mir bereits bei den Script-Laufzeiten gedacht.

Aber wie kann ich es sonst lösen? Die Daten sind nunmal Zeilenweise gespeichert (was ich auch gern so beibehalten würde, da je Monat viele Spalten gespeichert sind, die ich sonst auch nicht anders aufzuteilen wüsste).

Würde sowas auch mit einem Haufen Sub-Selects laufen?

SELECT (SELECT (t.a+t.b+t.c) AS Daten FROM tabelle t where t.JahrMonat = "201001) AS Dat201001, (SELECT (t.a+t.b+t.c) AS Daten FROM tabelle t where t.JahrMonat = "201002) AS Dat201002 ....

Ist dies performanter?
Member: nxclass
nxclass Mar 08, 2012 at 09:40:02 (UTC)
Goto Top
Da Du nur durch reduzieren der zu verarbeitenden Daten eine Verbesserung erzielen kannst - aber bei jedem Sub Select eine andere Where Bedingung vorhanden ist - sehe ich kaum Spielraum für Optimierungen über die Select Abfrage.

... ggf kann man vorher noch den Datenbestand auf das Jahr reduzieren
JahrMonat LIKE '2010%'  
... aber viel wird es wohl nicht bringen.

Meine Empfehlung:
  • Spalte das Feld JahrMonat auf in Jahr und Monat
  • Ersetze die Felder a - d durch key und value
Jahr | Monat | BereichsID | key | value
2010 | 1 | 1 | a | wert
2010 | 1 | 1 | b | wert
2010 | 1 | 1 | c | wert
2010 | 1 | 1 | d | wert
2010 | 2 | 1 | a | wert
...
... dann geht das Filtern und Gruppieren schneller und einfacher