2012-11-08 17 views
7

Gestern hatten wir ein Szenario, wo wir den Typ db field bekommen mussten und auf der Basis mussten wir die Beschreibung des Feldes schreiben. WieDatenbank Funktion VS Fallanweisung

Select (Case DB_Type When 'I' Then 'Intermediate' 
         When 'P' Then 'Pending' 
         Else 'Basic' 
     End) 
From DB_table 

Ich schlug vor, eine db-Funktion anstelle dieser Fallanweisung zu schreiben, weil das wiederverwendbar wäre. Wie

Select dbo.GetTypeName(DB_Type) 
from DB_table 

Der interessante Teil ist, Einer unserer Entwickler unter Verwendung der Datenbankfunktion ineffizient sein wird als database functions sind langsamer als Case statement. Ich suchte über das Internet, um die Antwort zu finden, die in Bezug auf Effizienz besser Ansatz ist, aber leider fand ich nichts, das als zufriedene Antwort betrachtet werden könnte. Bitte erleuchte mich mit deinen Gedanken, welcher Ansatz ist besser?

+1

Hat dieser 'dbo.GetTypeName (DB_Type)' den gleichen 'CASE' Ausdruck? Sie fragen nach dem Unterschied zwischen dem direkten Ausdruck eines CASE-Ausdrucks in eine Abfrage und dem Einfügen in eine benutzerdefinierte Funktion *** hinsichtlich der Leistung und Wiederverwendbarkeit ***. Recht? –

+0

Ja! alles ist gleich. –

Antwort

7
UDF function is always slower than case statements 

entnehmen Sie bitte den Artikel

http://blogs.msdn.com/b/sqlserverfaq/archive/2009/10/06/performance-benefits-of-using-expression-over-user-defined-functions.aspx

Der folgende Artikel Sie schlägt vor, wenn UDF verwenden

http://www.sql-server-performance.com/2005/sql-server-udfs/

Zusammenfassung:

Es gibt eine große Leistungseinbuße bezahlt, wenn Benutzerdefinierte Funktionen used.This Strafe zeigt sich als schlechte Abfrageausführungszeit ist, wenn eine Abfrage eine benutzerdefinierte Funktion auf eine große Anzahl von Zeilen gilt, in der Regel 1000 oder mehr. Die Strafe tritt auf, weil das SQL Server-Datenbankmodul seine eigene interne Cursor-ähnliche Verarbeitung erstellen muss. Es muss jede UDF in jeder Zeile aufrufen. Wenn das UDF in der WHERE-Klausel verwendet wird, kann dies als Teil des Filterns der Zeilen auftreten. Wenn die UDF in der Auswahlliste verwendet wird, geschieht dies beim Erstellen der Ergebnisse der Abfrage, die an die nächste Stufe der Abfrageverarbeitung übergeben wird. Es ist die zeilenweise Verarbeitung, die SQL Server am meisten verlangsamt.

1

Bei Verwendung einer Skalarfunktion (eine Funktion, die einen Wert zurückgibt) wird der Inhalt der Funktion einmal pro Zeile ausgeführt, die case-Anweisung wird jedoch über den gesamten Satz hinweg ausgeführt.

Durch die Arbeit mit dem gesamten Satz ermöglichen Sie dem Server, Ihre Abfrage effizienter zu optimieren.

Also die Theorie geht, dass die gleiche Abfrage beide Wege gegen einen großen Datensatz laufen, dann sollte die Funktion langsamer sein. Der Unterschied kann jedoch trivial sein, wenn Sie mit Ihren Daten arbeiten, daher sollten Sie beide Methoden ausprobieren und sie testen, um zu bestimmen, ob ein Performance-Trade-Off den erhöhten Nutzen einer Funktion wert ist.