AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

SQL optimieren

Ein Thema von Dumpfbacke · begonnen am 1. Jan 2010 · letzter Beitrag vom 4. Jan 2010
Antwort Antwort
Dumpfbacke

Registriert seit: 10. Mär 2005
Ort: Mitten in Deutschland
332 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

SQL optimieren

  Alt 1. Jan 2010, 16:49
Datenbank: Interbase • Version: 6.01 • Zugriff über: IBX
Hallo Leute,
kann mir jemand sagen, ob ich den SQL hier optimieren kann. Es dauer ca. 35 sec. bis das Ergebnis vorliegt.
Es liegt ein Index auf jedem Feld der Where Clausel und auf den Felder in den Joins.
Ansonsten muß ich alle Daten in eine Tabelle legen denn dann geht es schneller. Das Problem kommt von den Joins vermute ich einmal.

SQL-Code:
Select Cast(GFP.Monat as Float) as Monat,
SUM(SK.AnzahlGF) as AnzahlGF,SUM(SK.KostenHoechsterist) as KostenGf,
SUM(SK.KostenHoechsterist) / SUM(SK.AnzahlGF) as KostenJeGf
from Hauptkosten SK
Left Outer Join Teilkosten GFK on GFK.Auftragsart = SK.Auftragsart
Left Outer Join Finanzen GFP on GFP.IDTeilkosten = GFK.TeilkostenZaehler
                                              and GFP.Auftragsnummer = SK.Auftragsnummer
Left Outer Join Tabelle1 on GFP.Auftragsnummer = Tabelle1.Auftragsnummer
Where Tabelle1.AuftrageingangJahr = '2009'
and GFP.Jahr = '2009'
and SK.Auftragsart = 'Neukunde'

Group by Monat
Order by 1
Tanja
Tanja
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: SQL optimieren

  Alt 1. Jan 2010, 17:10
Was für einen Typ hat Monat?
Wie sehen die Tabellen aus?
Reicht es nicht das Jahr in der Hauptkostentabelle zu filtern?
Markus Kinzler
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: SQL optimieren

  Alt 1. Jan 2010, 17:17
Wenn du nach Teilkosten.Monat gruppierst, benötigst Du den ersten LEFT JOIN nicht, denn es gilt (wenn ich mich nicht irre*):
SELECT B.DATA, SUM(A.FOOBAR) FROM A LEFT JOIN B ON A.ID = B.ID SELECT B.DATA, SUM(A.FOOBAR) FROM B JOIN A ON B.ID = A.ID Das sollte eventuell ein wenig einsparen, sauberer ist es aber allemal.

*Und ich irre mich nie, wenn ich mich nicht irre.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: SQL optimieren

  Alt 1. Jan 2010, 17:37
Wegen Nichtbeachtung gelöscht...
  Mit Zitat antworten Zitat
Dumpfbacke

Registriert seit: 10. Mär 2005
Ort: Mitten in Deutschland
332 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: SQL optimieren

  Alt 1. Jan 2010, 18:01
Zitat von mkinzler:
Was für einen Typ hat Monat?
ist ein Char Feld
Zitat:
Wie sehen die Tabellen aus?
Die Tabelle1 hat etliche Spalten mit einigem an Daten. Die anderen Tabelle nur wenige < 10 Stück
Zitat:
Reicht es nicht das Jahr in der Hauptkostentabelle zu filtern?
Nein leider nicht. In der Hauptkosten ist das Datum der Abrechnung und in der Tabelle1 das Eingangsdatum vorhaden.

Diese Idee habe ich mitlerweile auch schnon gehabt.

Ich füge in der Tabelle noch zwei Splate mit dem Eingangsdatum ein und somit fallen dann einige Joins weg. Dann solte es schneller gehen.
Tanja
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#6

Re: SQL optimieren

  Alt 4. Jan 2010, 09:52
Ich würde die Reihenfolge der Tabellen in der Abfrage ändern:
SQL-Code:
select cast(GFP.Monat as float) as Monat,
       sum(SK.AnzahlGF) as AnzahlGF,
       sum(SK.KostenHoechsterist) as KostenGf,
       sum(SK.KostenHoechsterist) / sum(SK.AnzahlGF) as KostenJeGf

from Tabelle1
left join Finanzen GFP on (GFP.Auftragsnummer = Tabelle1.Auftragsnummer)
left join Teilkosten GFK on (GFK.TeilkostenZaehler = GFP.IDTeilkosten)
left join Hauptkosten SK on (SK.Auftragsart = GFK.Auftragsart) and
                             (SK.Auftragsnummer = Tabelle1.Auftragsnummer)

where (Tabelle1.AuftrageingangJahr = '2009') and
      (GFP.Jahr = '2009') and
      (SK.Auftragsart = 'Neukunde')

group by Monat
order by 1
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: SQL optimieren

  Alt 4. Jan 2010, 10:12
Hallo,

Zur Not eine SP drausmachen,
damit können die LEFT JOINS wegfallen.


Bei IB könntest du deine Abfrage auch mal durch den
IBPlanalyzer (google) schicken,
um festzustellen, wo es genau hängt.

Left Joins sind bei IB/FB übrigens immer langsamer als (Inner) Joins,
wenn NULL-Werte "gefunden" werden.

Deshalb sollten Sie vermieden werden.
Man könnte zum Bsp. Dummy-Einträge in den entsprechenden Tabelleb erzeugen
und dann (Inner) Joins nehmen.


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von rwachtel
rwachtel

Registriert seit: 26. Aug 2004
Ort: Köln
530 Beiträge
 
RAD-Studio 2010 Pro
 
#8

Re: SQL optimieren

  Alt 4. Jan 2010, 10:51
Zitat von omata:
Wegen Nichtbeachtung gelöscht...
Kindergarten?
Robert Wachtel
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#9

Re: SQL optimieren

  Alt 4. Jan 2010, 15:00
Zitat von hoika:
Left Joins sind bei IB/FB übrigens immer langsamer als (Inner) Joins,
wenn NULL-Werte "gefunden" werden.
Das möchte ich so pauschal nicht stehen lassen.
Left Joins können ein gutes Werkzeug zur Optimierung sein.
Natürlich ist es etwas schwieriger eine Abfrage über mehrere Tabellen mit "left join" optimal zu gestalten.
Dazu muss man die Tabellenstruktur(welcher Index usw.) schon gut kennen.
Auf jeden Fall solte man sich den resultierenden Plan anschauen oder im schlimmsten Fall selbst vorgeben.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: SQL optimieren

  Alt 4. Jan 2010, 21:16
Zitat von rwachtel:
Zitat von omata:
Wegen Nichtbeachtung gelöscht...
Kindergarten?
Nö! Bin nur nicht so menschenverachtend...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz