Ich überschreibe eine alte gespeicherte Prozedur und habe bei der Verwendung einer Funktion anstelle von Inline-Code auf ein unerwartetes Leistungsproblem gestoßen.
Die Funktion ist sehr einfach wie folgt:
%Vor%Ich habe also zwei identische Abfragen, aber die eine verwendet die Funktion und die andere die Berechnung in der Abfrage selbst:
%Vor%Jetzt läuft die Abfrage mit dem Inline-Code dreimal schneller als die mit der Funktion.
Was Sie haben, ist eine skalare UDF (nimmt 0 bis n Parameter und gibt einen skalaren Wert zurück). Solche UDFs verursachen normalerweise eine zeilenweise Operation Ihrer Abfrage, sofern sie nicht mit konstanten Parametern aufgerufen wird, mit genau der Art der Leistungseinbuße, die bei Ihrer Abfrage auftritt.
Siehe hier , hier und hier für detaillierte Erklärungen der Fallstricke bei der Verwendung von UDFs.
Verwenden Sie keine langsame skalare UDF, verwenden Sie eine schnelle Inline-Funktion. Beispiele hier:
Ihren Code mit Tabelle wiederverwenden -Valued UDFs
Calculating Dritter Mittwoch des Monats mit Inline-UDFs
Viele verschachtelte Inline-UDFs sind sehr schnell
Die Frage ist sehr häufig: Sie wurde schon hunderte Male gestellt und beantwortet, als solche hat sie einige vorbereitete Antworten.
Abhängig vom Verwendungskontext kann der Abfrageoptimierer den Inline-Code analysieren und einen großen Index verwendenden Abfrageplan ermitteln, während er die Funktion für eine ähnlich detaillierte Analyse nicht "inline" einbaut und damit endet ein untergeordneter Abfrageplan, wenn die Funktion beteiligt ist. Sehen Sie sich die beiden Abfragepläne nebeneinander an, und Sie sollten diese Hypothese ziemlich leicht bestätigen (oder widerlegen) können!
Tags und Links sql sql-server sql-server-2005