# SQL abfrage



## Manuela (10. Jun 2009)

```
SELECT Distinct Kunden.kunden_bezeichnung,
          count( abrechnung.auftrags_NR)menge, Sum( abrechnung.sum_MatR)mat_r,
          Sum( abrechnung.sum_MatG)mat_g, Sum( abrechnung.sum_MatM)mat_m,
          Sum( abrechnung.sumArbR)arb_r, Sum( abrechnung.sumArbG)arb_g,
          Sum( abrechnung.sumArbM)arb_m, Sum( abrechnung.VerpR)verp_r,
          Sum( abrechnung.VerpG)verp_g, Sum( abrechnung.VerpM)verp_m,
          Sum( abrechnung.PorR)pot_r, Sum( abrechnung.PorG)pot_G,
          Sum( abrechnung.PorM)por_M, Sum( abrechnung.KleinmR)klein_r,
          Sum( abrechnung.KleinmG)klein_g, Sum( abrechnung.KleinmM)klein_m,
          Sum( abrechnung.FatkosR)fahrt_r, Sum( abrechnung.FatkosG)fahrt_g,
          Sum( abrechnung.FatkosM)fahrt_m, Sum( abrechnung.Garpau)gr_au
         FROM Kunden inner join auftragsert  inner join abrechnung on
           kunden.kunden_bezeichnung = auftragsert.aufkosger and
           auftragsert.auftragsnr=abrechnung.auftrags_NR
         where auftragsert.aufsto=false and auftragsert.auft_edatum>'2009-05-01' and
           auft_edatum <='2009-06-10'
         Group by kunden_bezeichnung
```
das dauert genau 4.1 Minuten.
Wie kann ich das schneller machen ???


----------



## bronks (11. Jun 2009)

Wieviele Sätze haben die Tabellen?
Sind die Felder über welche Du joinst und in den Kriterien verwendest indiziert?


----------



## SlaterB (11. Jun 2009)

ist es mit nur einem Inner Join schneller?


----------



## maki (12. Jun 2009)

Dein DB Server bietet dir sicher die Möglichkeit einen Trace o.ä. zu fahren.
Jedenfalls hast du da einiges an Logik/Verarbeitung in deiner SQL Abfrage...


----------



## homer65 (12. Jun 2009)

Indem du die richtigen Indizes anlegst.


----------



## JohannisderKaeufer (12. Jun 2009)

Distinct stinkt

läuft das ganze auch ohne distinct richtig? 

Sollte es aber.


```
FROM Kunden JOIN auftragsert ON kunden.kunden_bezeichnung = auftragsert.aufkosger
 JOIN abrechnung ON auftragsert.auftragsnr=abrechnung.auftrags_NR
```

Gibt's einen Unterschied wenn die From-Clause so ausschaut?


```
SELECT auftragsert.aufkosger
          count( abrechnung.auftrags_NR)menge, Sum( abrechnung.sum_MatR)mat_r,
          Sum( abrechnung.sum_MatG)mat_g, Sum( abrechnung.sum_MatM)mat_m,
          Sum( abrechnung.sumArbR)arb_r, Sum( abrechnung.sumArbG)arb_g,
          Sum( abrechnung.sumArbM)arb_m, Sum( abrechnung.VerpR)verp_r,
          Sum( abrechnung.VerpG)verp_g, Sum( abrechnung.VerpM)verp_m,
          Sum( abrechnung.PorR)pot_r, Sum( abrechnung.PorG)pot_G,
          Sum( abrechnung.PorM)por_M, Sum( abrechnung.KleinmR)klein_r,
          Sum( abrechnung.KleinmG)klein_g, Sum( abrechnung.KleinmM)klein_m,
          Sum( abrechnung.FatkosR)fahrt_r, Sum( abrechnung.FatkosG)fahrt_g,
          Sum( abrechnung.FatkosM)fahrt_m, Sum( abrechnung.Garpau)gr_au
         FROM auftragsert  JOIN abrechnung ON
           auftragsert.auftragsnr=abrechnung.auftrags_NR
           AND auftragsert.aufsto=false AND auftragsert.auft_edatum>'2009-05-01' AND
           auftragsert.auft_edatum <='2009-06-10'
         GROUP BY auftragsert.aufkosger
```

Ohne die Daten zu kennen würde ich mal behaupten, das das hier um welten schneller ist und das selbe ergebnis liefert, da die Tabelle Kunden überhaupt nicht im Ergebnis auftaucht.

Die Kunden_bezeichnung wird ja mit auftragsert.aufkosger gleichgesetzt.

:applaus::applaus::applaus::applaus::applaus:


----------



## Manuela (16. Jun 2009)

Hallo,
Habe Fehler gefunden jetzt geht die Abfrage wie geschmiert.

JohannisderKaeufer Du hattest natürlich recht.

Danke 

Man steht im Wald und man sieht keine Bäume.:applaus:


----------

