Benutzer mit den meisten Antworten
Performance benutzerdefinierter Funktionen nimmt automatisch ab

Frage
-
Ich stelle fest, dass manche benutzerdefinierte Tabellenwertige Funktionen innerhalb von einigen Tagen etwa um den Faktor 20 langsamer werden. Nach DROP und CREATE FUNCTION laufen sie wieder schnell, bis sie nach einigen Tagen wieder langsam werden.
Diesen Verhalten habe ich auf MS SQL Server 2000, 2008 und 2008 R2 bei verschiedenen Funktionen beobachtet, auch wenn die Indizes und Statistiken der zugehörigen Tabellen aktuell gehalten werden.
Gibt es sonstige Optimierungen, die "altern" können und mit DROP und CREATE erneuert werden? Oder gibt es gar welche, die mit der Zeit ausbremsen und ausgeschaltet werden sollten?
Gruß
Volker
Antworten
-
Hallo Volker,
Was durch das Drop & Create nennenswert passiert ist, das die UDF neu kompiliert und ein neuer Ausführungsplan erzeugt wird. Das kannst Du auch per sp_recompile erreichen
EXEC sp_recompile N'ufnGetContactInformation'
Allerdings kann ich mir nur schwer vorstellen, das sich innerhalb kürzester Zeit sich die Datenverteilung derart ändert, das der hinterlegte Ausführungsplan suboptimal wird.
Interessant wäre auch, was die UDF macht und wie Du sie aufrufst; wenn sie in einer Abfrage zeilenweise aufgerufen wird, kann das schnell zur Last der Performanz geht.
Siehe auch Technet Script Center: Mark Object For Recompilation, falls Du mit einem Scrip gleich mehere Objekt(typen) zum Rekompilieren markieren lassen willst
- Bearbeitet Olaf HelperMVP Mittwoch, 15. August 2012 15:27 Link
- Als Antwort markiert drh1 Donnerstag, 16. August 2012 14:54
Alle Antworten
-
Hallo Volker,
welche Art von Function ist es denn? Ggfs. hilft dir das hier:
Da bin ich letztens auch mal wieder auf die Schnauze gefallen. Die MSTVF in eine Inline Table Function umgeschrieben und schon klappts um den Faktor 20 bis 100 besser.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hallo Volker,
Was durch das Drop & Create nennenswert passiert ist, das die UDF neu kompiliert und ein neuer Ausführungsplan erzeugt wird. Das kannst Du auch per sp_recompile erreichen
EXEC sp_recompile N'ufnGetContactInformation'
Allerdings kann ich mir nur schwer vorstellen, das sich innerhalb kürzester Zeit sich die Datenverteilung derart ändert, das der hinterlegte Ausführungsplan suboptimal wird.
Interessant wäre auch, was die UDF macht und wie Du sie aufrufst; wenn sie in einer Abfrage zeilenweise aufgerufen wird, kann das schnell zur Last der Performanz geht.
Siehe auch Technet Script Center: Mark Object For Recompilation, falls Du mit einem Scrip gleich mehere Objekt(typen) zum Rekompilieren markieren lassen willst
- Bearbeitet Olaf HelperMVP Mittwoch, 15. August 2012 15:27 Link
- Als Antwort markiert drh1 Donnerstag, 16. August 2012 14:54
-
@Stefan:
Danke für die schnelle Antwort.
Einige Funkionen waren Inline. Der neueste Fall ist eine MSTVF. MSTVF werden nur verwendet, wenn inline nicht möglich ist.
Abfragen zu beschleunigen, ist natürlich immer ein Ziel. Jedoch richtet sich meine Fragestellung auf das "altern". -
@Olaf:
Ebenso Danke für die schnelle Antwort.
EXEC sp_recompile bringt den gewünschten Effekt.
Ich konnte es gerade an einer UDF testen, die dadurch von 13,0 auf 0,2 s beschleunigt wurde. Das 1. Mal nach sp_recompile braucht sie 0,6 s, um den Ausführungsplan zu generieren. Die Daten, auf die die UDF zugreift, ändern sich gar nicht oder sehr wenig. Je nach Argumentwerten variiert jedoch die Datenverteilung erheblich.
Bereits nach einigen Minuten braucht sie wieder 13,0 s. sp_recompile beschl. auf 0,2 s. Soeben konnte ich es dreimal reproduzieren. Jedes Mal wurde sie nach einigen Minuten wieder langsam.
Ich habe nun den Hinweis "OPTIMIZE FOR @var = const" hinzugefügt, das es erstmal zu beheben scheint.
Bei anderen UDFs könnte es nützen, dass sie häufiger rekompiliert werden, als es der SQL Server per Default tut. OPTION RECOMPILE erzwingt es bei jeder Ausführung. Gibt es eine Einstellung, dass eine UDF häufiger, aber nicht jedes Mal rekompiliert wird? -
Gibt es eine Einstellung, dass eine UDF häufiger, aber nicht jedes Mal rekompiliert wird?
Eine solche Einstellung ist mir nicht bekannt.
Das Verhalten komm mir sehr merkwürdig vor. Hast Du mal den Ausführungsplan geprüft, wenn es schnell / langsam läuft, ob Du da Hinweise auf das "Wieso" findest?