7 Stimmen

Warum eine einfache T-SQL UDF-Funktion die Code-Ausführung 3 Mal langsamer macht

Ich schreibe gerade eine alte gespeicherte Prozedur um und bin auf ein unerwartetes Leistungsproblem gestoßen, als ich eine Funktion anstelle von Inline-Code verwendet habe.

Die Funktion ist sehr einfach und lautet wie folgt:

ALTER FUNCTION [dbo].[GetDateDifferenceInDays] 
(       
@first_date SMALLDATETIME, 
@second_date SMALLDATETIME
)
RETURNS INT 
AS
BEGIN 

RETURN ABS(DATEDIFF(DAY, @first_date, @second_date))

END

Ich habe also zwei identische Abfragen, aber eine verwendet die Funktion und die andere führt die Berechnung in der Abfrage selbst durch:

ABS(DATEDIFF(DAY, [mytable].first_date, [mytable].second_date))

Jetzt läuft die Abfrage mit dem Inline-Code dreimal schneller als diejenige mit der Funktion.

14voto

nagul Punkte 2225

Es handelt sich um eine skalare UDF (nimmt 0 bis n Parameter an und gibt einen skalaren Wert zurück). Solche UDFs führen in der Regel zu einer zeilenweisen Verarbeitung Ihrer Abfrage, es sei denn, sie werden mit konstanten Parametern aufgerufen, was genau die Art von Leistungseinbußen zur Folge hat, die Sie bei Ihrer Abfrage feststellen.

Ver aquí , aquí y aquí für detaillierte Erläuterungen zu den Leistungsfallen bei der Verwendung von UDFs.

5voto

Alex Martelli Punkte 805329

Je nach Verwendungskontext kann der Abfrageoptimierer in der Lage sein, den Inline-Code zu analysieren und einen großartigen Abfrageplan zu erstellen, der den Index nutzt, während er die Funktion nicht für eine ähnlich detaillierte Analyse "einbindet" und somit einen schlechteren Abfrageplan erhält, wenn die Funktion beteiligt ist. Schauen Sie sich die beiden Abfragepläne nebeneinander an, und Sie sollten in der Lage sein, diese Hypothese ziemlich leicht zu bestätigen (oder zu widerlegen)!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X