Warum eine einfache T-SQL-UDF-Funktion die Codeausführung dreimal langsamer macht

7

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.

    
Giuseppe Romagnuolo 07.08.2009, 17:19
quelle

3 Antworten

14

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.

    
nagul 07.08.2009, 17:34
quelle
13

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.

    
A-K 07.08.2009 18:01
quelle
5

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!

    
Alex Martelli 07.08.2009 17:22
quelle

Tags und Links