Optimieren einer Query

04/03/2010 - 13:24 von Tamara Mikes | Report spam
Salü alle zusammen

Ich dachte, ich hàtte eine einfache kleine Abfrage. Heute scheint es mir,
als hàtte ich ein Gigantissimo. Auf meinem Entwicklungsrechner lief die
Abfrage innerhalb einer Sekunde durch. Jetzt habe ich schlappe 102'000
Datensàtze welche meine Abfrage liefert und sie bricht mit einem Timeout ab.

In welcher Richtung soll ich meine Abfrage optimieren damit das ganze ein
bischen schneller wird? Ich vermute die Problematik in der Berechnung der
Spalte LohnKosten
((dbo.tblDatArbeitszeit.datArStunden / 60 * dbo.vDatLohn.datLoStundenLohn)
* (dbo.tblDaten2Kst.Anteil / 100) * - 1 AS LohnKosten

Alle ZahlenFelder sind in der Datenbank als int gespeichert. Sollte ich das
der Geschwindigkeit zuliebe zu Float àndern? Den Cast habe ich gemacht, weil
es eine zu grosse Rundungsdifferenz gibt, wenn ich mit int rechne.

Ich habe auch heraus gefunden, dass wenn ich /60 und *-1 weg nehme, also
weniger Berechnungen habe, die Ausführungsgeschwindigkeit nicht besser wird.
Ist diese Beobachtrung richtig oder werde ich hier gefühlsmàssig getàuscht?

Der vollstàndige Select ist:

SELECT dbo.tblKst.kstBezeichnung AS kst,
dbo.tblDatArbeitszeit.datArDatum, (dbo.tblDatArbeitszeit.datArStunden / 60 *
dbo.vDatLohn.datLoStundenLohn)
* (dbo.tblDaten2Kst.Anteil / 100) * - 1 AS LohnKosten
FROM dbo.tblDaten2Kst INNER JOIN
dbo.tblKst ON dbo.tblDaten2Kst.kstNr =
dbo.tblKst.kstID INNER JOIN
dbo.tblDatArbeitszeit INNER JOIN
dbo.vDatLohn ON dbo.tblDatArbeitszeit.datArPnr =
dbo.vDatLohn.datLoPNr ON dbo.tblDaten2Kst.D2KExtID =
dbo.tblDatArbeitszeit.datArExtId


Vielen lieben Dank für Informationen welche die Abfrage schneller machen.

Gruss Tamara
 

Lesen sie die antworten

#1 Elmar Boye
04/03/2010 - 13:42 | Warnen spam
Hallo Tamara,

"Tamara Mikes" schrieb ...
Ich dachte, ich hàtte eine einfache kleine Abfrage. Heute scheint es mir, als hàtte ich ein Gigantissimo. Auf meinem
Entwicklungsrechner lief die Abfrage innerhalb einer Sekunde durch. Jetzt habe ich schlappe 102'000 Datensàtze welche meine
Abfrage liefert und sie bricht mit einem Timeout ab.



Schau Dir die Kriterien (WHERE, GROUP BY, HAVING) an
und ob Du dafür entsprechende Indizes hast.

In welcher Richtung soll ich meine Abfrage optimieren damit das ganze ein bischen schneller wird? Ich vermute die Problematik in
der Berechnung der Spalte LohnKosten
((dbo.tblDatArbeitszeit.datArStunden / 60 * dbo.vDatLohn.datLoStundenLohn)
* (dbo.tblDaten2Kst.Anteil / 100) * - 1 AS LohnKosten



das ist für die Ausführung so gut wie belanglos.

Alle ZahlenFelder sind in der Datenbank als int gespeichert. Sollte ich das der Geschwindigkeit zuliebe zu Float àndern?



Integer Arithmetik ist im allgemeinen die schnellste.
Ich würde das mit decimal(n, 2) machen:
((dbo.tblDatArbeitszeit.datArStunden / 60.00 * dbo.vDatLohn.datLoStundenLohn)
* (dbo.tblDaten2Kst.Anteil / 100.00) * - 1.00 AS LohnKosten

Das ist zwar noch langsamer als integer oder Fliesskomma aber dafür genauer.
Nur ist der Unterschied auch 102TSD mal gemacht so geringfügig, dass
man an der Stelle als letztes "optimieren" sollte.
Ich habe auch heraus gefunden, dass wenn ich /60 und *-1 weg nehme, also weniger Berechnungen habe, die Ausführungsgeschwindigkeit
nicht besser wird. Ist diese Beobachtrung richtig oder werde ich hier gefühlsmàssig getàuscht?



Hast Du.

Gruß Elmar

Ähnliche fragen