Filter auf berechnete Felder, Performance

23/10/2009 - 16:54 von Richard Ohl | Report spam
Hallo,
ich hoffe, dass ihr mir mit einem kurzen Tipp oder Link weiterhelfen könnt.
Ich verwende hàufig dynamische Suchbedingungen, abhàngig von Parametern in
der SP, bspw. @showCurrentSeason bit = 1 (zeigt aus einer Liste mit
Datensàtzen nur die, bei denen das date das aktuelle Jahr enthàlt.

Eine Abfrage kann nun
SELECT foo, DATEPART(YYYY, date) as season from bar WHERE DATEPART(YYYY,
date) = CASE WHEN @showCurrentSeason = 1 THEN 2009 ELSE DATEPART(YYYY, date)
END

Das mit dem Datum ist nur ein Beispiel, ich muss hàufig auch nach sehr
speziellen Funktionsergebnissen filtern (im Beispiel wàre in between
vermutlich eher angebracht - mir geht's um das Prinzip).

Im Grunde muss die Engine ja nun pro Datensatz DATEPART berechnen und dann
noch einmal für die Suchbedingung und im extremsten Fall, wenn die
Suchbedingungen identisch sind, noch einmal...
Gibt's da (außer komplett dynamischem SQL) noch was von Ratiopharm?

Danke für alle Tipps,
Richard
To be stupid, selfish, and have good health are three requirements for
happiness, though if stupidity is lacking, all is lost. -- Gustave Flaubert
 

Lesen sie die antworten

#1 Christoph Ingenhaag
25/10/2009 - 10:42 | Warnen spam
Hallo Richard,

(indizierte) berechnete Spalten können Sinn machen. Das müsstest du aber
anhand der vorhandenen Daten testen.
http://technet.microsoft.com/de-de/...91250.aspx
http://msdn.microsoft.com/de-de/lib...90%29.aspx

Solche Konstrukte
SELECT foo, DATEPART(YYYY, date) as season from bar WHERE DATEPART(YYYY,
date) = CASE WHEN @showCurrentSeason = 1 THEN 2009 ELSE DATEPART(YYYY,
date)
END



kannst du z.B. auch so aufteilen:

if @showCurrentSeason = 1
SELECT foo, DATEPART(YYYY, date) as season from bar
WHERE DATEPART(YYYY,date) = 2009
else
SELECT foo, DATEPART(YYYY, date) as season from bar

Dann werden beide Statements getrennt voneinander optimiert. Auch hier musst
du dir die Ausführungsplàne genau anschauen. Da der Optimizer anhand der
Statistiken und anhand der bekannten Parameter entscheidet welcher Plan der
geeigneteste sein könnte, kann es sein, dass eine unscharfe Bedingung wie
CASE WHEN @showCurrentSeason = 1 THEN 2009 ELSE DATEPART(YYYY, date)END den
Optimizer einen defensiveren Plan wàhlen làsst, der insgesamt für die
Datenlage besser ist, als Plàne die für einzelne Werte ideal, aber für die
anderen Werte schlecht wàren. Insbesondere für unbekannte Daten sind
defensivere Plàne insgesamt besser. Für SQL Server 2008 ist für diesen Zweck
der Hint optimize for unknown
http://blogs.msdn.com/sqlprogrammab...ature.aspx
eingeführt worden.

Wenn du dynamisches SQL verwendest, dann benutze sp_executesql, damit die
Plàne wiederverwandt werden können. Dabei ist die größte Gefahr sql
injection!
Nicht mehr aktuell, zeigt aber den Einfallssreichtum für injections:
http://www.nextgenss.com/papers/adv...ection.pdf
und hier Artikel zu dynamischen SQL http://www.sommarskog.se/ (auch Verweise
auf insidesql.org mit deutscher Übersetzung)

Viele Grüße
Christoph

"Richard Ohl" schrieb im Newsbeitrag
news:
Hallo,
ich hoffe, dass ihr mir mit einem kurzen Tipp oder Link weiterhelfen
könnt.
Ich verwende hàufig dynamische Suchbedingungen, abhàngig von Parametern in
der SP, bspw. @showCurrentSeason bit = 1 (zeigt aus einer Liste mit
Datensàtzen nur die, bei denen das date das aktuelle Jahr enthàlt.

Eine Abfrage kann nun
SELECT foo, DATEPART(YYYY, date) as season from bar WHERE DATEPART(YYYY,
date) = CASE WHEN @showCurrentSeason = 1 THEN 2009 ELSE DATEPART(YYYY,
date)
END

Das mit dem Datum ist nur ein Beispiel, ich muss hàufig auch nach sehr
speziellen Funktionsergebnissen filtern (im Beispiel wàre in between
vermutlich eher angebracht - mir geht's um das Prinzip).

Im Grunde muss die Engine ja nun pro Datensatz DATEPART berechnen und dann
noch einmal für die Suchbedingung und im extremsten Fall, wenn die
Suchbedingungen identisch sind, noch einmal...
Gibt's da (außer komplett dynamischem SQL) noch was von Ratiopharm?

Danke für alle Tipps,
Richard
To be stupid, selfish, and have good health are three requirements for
happiness, though if stupidity is lacking, all is lost. -- Gustave
Flaubert

Ähnliche fragen